echarts多个折线图共用X轴,实现tooltip合并和分离

news2025/1/18 6:40:59

echarts共享X轴案例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>

        <style>
            .wrap {
                width: 100%;
                height: 400px;
                overflow: hidden;
            }
            /* #lineChart {
                width: 100%;
                height: 100%;
            } */
        </style>
    </head>
    <body>
        <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>

        <div id="lineChart" style="width: 800px; height: 600px"></div>

        <script>
            myChart = null; // 定义变量用来存放echarts实例
            xData = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; // 两个echarts公用的x轴的数据
            y1Data = [8888, 9999, 7777, 10000, 3334, 7878, 6543]; // 小件货物
            y2Data = [56, 64, 32, 58, 64, 76, 81]; // 网点负荷
            y3Data = [88, 99, 77, 100, 21, 66, 95]; // 大件货物

            // 画图方法
            let drawEcharts = function () {
                myChart = echarts.init(document.getElementById('lineChart'));
                let options = {
                    color: ['#bfa', '#baf', 'pink', '#baf'], // 配置数据颜色
                    grid: [
                        // 配置第一个折线图的位置
                        {
                            left: '14.5%',
                            right: '12%',
                            top: '10%',
                            height: '32%',
                        },
                        // 配置第二个折线图位置
                        {
                            left: '14.5%',
                            right: '12%',
                            top: '50%',
                            height: '32%',
                        },
                    ],
                    tooltip: {
                        trigger: 'axis', //axis /item
                        // formatter函数动态修改tooltip样式
                        formatter: function (params) {
                            if (params) {
                                var htmlStr = '';
                                htmlStr += params[0].name.replace(/\-/g, '/') + '<br/>'; //x轴的名称
                                for (var i = 0; i < params.length; i++) {
                                    var param = params[i]; // 存一份item项
                                    var seriesName = param.seriesName; //图例名称
                                    var value = param.value; //y轴值
                                    var color = param.color; //图例颜色
                                    htmlStr += '<div>';
                                    htmlStr += '<span style="margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:5px;background-color:' + color + ';"></span>';
                                    //圆点后面显示的文本
                                    htmlStr += seriesName + ':' + value;
                                    switch (seriesName) {
                                        case '小件货物':
                                            htmlStr += ' ' + '件';
                                            break;
                                        case '网点负荷':
                                            htmlStr += ' ' + '%';
                                            break;
                                        case '大件货物':
                                            htmlStr += ' ' + '件';
                                            break;
                                        default:
                                            htmlStr += ' ';
                                    }
                                    htmlStr += '</div>';
                                }
                                return htmlStr;
                            } else {
                                return;
                            }
                        },
                        backgroundColor: '#ccc',
                        borderWidth: 1,
                        borderColor: '#ccc',
                        padding: 10,
                        textStyle: {
                            color: '#000',
                            fontSize: 12,
                            align: 'left',
                        },
                        hideDelay: 10000, //延时消失时间
                    },
                    legend: {
                        show: true,
                        x: 'center',
                        y: '0',
                        data: ['小件货物', '网点负荷', '大件货物', '网点负荷'],
                        textStyle: {
                            fontSize: 12,
                        },
                    },
                    // 将上下两个tootip合成一个
                    axisPointer: {
                        link: { xAxisIndex: 'all' },
                    },
                    xAxis: [
                        {
                            type: 'category',
                            scale: true,
                            axisLabel: {
                                show: false,
                            },
                            axisTick: {
                                alignWithLabel: true,
                            },
                            splitLine: {
                                show: false,
                            },
                            data: xData, //x轴时间的数据
                        },
                        {
                            gridIndex: 1,
                            type: 'category',
                            scale: true,
                            axisLabel: {
                                fontSize: 10,
                            },
                            axisTick: {
                                alignWithLabel: true,
                            },
                            splitLine: {
                                show: false,
                            },
                            data: xData, //x轴时间的数据
                        },
                    ],
                    yAxis: [
                        {
                            type: 'value',
                            name: '件数',
                            nameLocation: 'center',
                            nameGap: 50,
                            nameTextStyle: {
                                fontSize: 12,
                                fontWeight: '500',
                            },
                            axisLabel: {
                                fontSize: 12,
                            },
                            min: function (value) {
                                return parseInt(value.min);
                            },
                            max: function (value) {
                                return parseInt(value.max * 1.05);
                            },
                            scale: false,
                            boundaryGap: [0, '100%'],
                            splitLine: {
                                show: false,
                            },
                            splitNumber: 4, //设置坐标轴的分割段数
                        },
                        {
                            type: 'value',
                            name: '负荷/百分比',
                            nameLocation: 'center',
                            nameGap: 42,
                            nameTextStyle: {
                                fontSize: 12,
                            },
                            axisLabel: {
                                fontSize: 12,
                            },
                            // min: function (value) {
                            //   return parseInt(value.min);
                            // },
                            // max: function (value) {
                            //   return parseInt(value.max * 1.05);
                            // },
                            scale: true,
                            boundaryGap: [0, '100%'],
                            splitLine: {
                                show: false,
                            },
                            splitNumber: 4, //设置坐标轴的分割段数
                        },
                        {
                            type: 'value',
                            name: '件数',
                            nameLocation: 'center',
                            gridIndex: 1,
                            nameGap: 30,
                            nameTextStyle: {
                                fontSize: 12,
                            },
                            axisLabel: {
                                fontSize: 12,
                            },
                            min: function (value) {
                                return parseInt(value.min);
                            },
                            max: function (value) {
                                return parseInt(value.max * 1.05);
                            },
                            scale: true,
                            boundaryGap: [0, '100%'],
                            splitLine: {
                                show: false,
                            },
                            splitNumber: 4, //设置坐标轴的分割段数
                        },
                        {
                            type: 'value',
                            name: '负荷/百分比',
                            nameLocation: 'center',
                            gridIndex: 1,
                            nameGap: 42,
                            nameTextStyle: {
                                fontSize: 12,
                            },
                            axisLabel: {
                                fontSize: 12,
                            },
                            // min: function (value) {
                            //   return parseInt(value.min);
                            // },
                            // max: function (value) {
                            //   return parseInt(value.max * 1.05);
                            // },
                            scale: true,
                            boundaryGap: [0, '100%'],
                            splitLine: {
                                show: false,
                            },
                            splitNumber: 4, //设置坐标轴的分割段数
                        },
                    ],
                    dataZoom: [
                        {
                            type: 'inside',
                            startValue: y1Data.length - 4, // 放置最后4个数组
                            endValue: y1Data.length - 1,
                            xAxisIndex: [0, 1], // 显示 0 1 的数据,这个要加,不加的话,悬浮提示就会出问题
                        },
                    ],
                    series: [
                        {
                            name: '小件货物',
                            type: 'line',
                            xAxisIndex: 0,
                            yAxisIndex: 0,
                            hoverAnimation: true, // 悬浮的动画加上
                            data: y1Data, //小件货物
                            itemStyle: { normal: { label: { show: true } } },
                        },
                        {
                            name: '网点负荷',
                            type: 'line',
                            xAxisIndex: 0,
                            yAxisIndex: 1,
                            hoverAnimation: true, // 悬浮的动画加上
                            data: y2Data, //网点负荷
                        },
                        {
                            name: '大件货物',
                            type: 'line',
                            xAxisIndex: 1,
                            yAxisIndex: 2,
                            hoverAnimation: true, // 悬浮的动画加上
                            data: y3Data, //大件货物
                        },
                        {
                            name: '网点负荷',
                            type: 'line',
                            xAxisIndex: 1,
                            yAxisIndex: 3,
                            hoverAnimation: true, // 悬浮的动画加上
                            data: y2Data, //网点负荷
                        },
                    ],
                };

                myChart.setOption(options);

                // function autoTip() {
                //     timer = setTimeout(function () {
                //         //3.0以上版本的showTip使用方式
                //         //如何让三个点同时显示?
                //         myChart.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: 0 });
                //         myChart.dispatchAction({ type: 'showTip', seriesIndex: 1, dataIndex: 1 });
                //         myChart.dispatchAction({ type: 'showTip', seriesIndex: 2, dataIndex: 2 });
                //     }, 1000);
                // }
                // autoTip();

                //                 myChart1.group = "group1";
                // myChart2.group = "group1";
                // echarts.connect("group1");
            };

            drawEcharts();
        </script>
    </body>
</html>

效果图:

在此基础上,实现tooltip分别显示在各自grid中:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>

        <style>
            * {
                margin: 0;
                padding: 0;
            }
            .main {
                width: 100vw;
                margin-top: 20px;
            }
            #lineChart {
                position: relative;
                height: 50vh;
                overflow: hidden;
            }
            #lineChart2 {
                position: relative;
                height: 50vh;
                overflow: hidden;
            }
        </style>
    </head>
    <body>
        <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
        <div class="main">
            <div id="lineChart" style="width: 800px; height: 250px"></div>
            <div id="lineChart2" style="width: 800px; height: 250px"></div>
        </div>
        <script>
            myChart = null; // 定义变量用来存放echarts实例
            xData = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']; // 两个echarts公用的x轴的数据
            y1Data = [8888, 9999, 7777, 10000, 3334, 7878, 6543]; // 小件货物
            y2Data = [56, 64, 32, 58, 64, 76, 81]; // 网点负荷
            y3Data = [88, 99, 77, 100, 21, 66, 95]; // 大件货物

            // 画图方法
            let drawEcharts = function () {
                myChart1 = echarts.init(document.getElementById('lineChart'));
                myChart2 = echarts.init(document.getElementById('lineChart2'));
                let options = {
                    color: ['#bfa', '#baf', 'pink', '#baf'], // 配置数据颜色
                    grid: [
                        // 配置第一个折线图的位置
                        {
                            left: '14.5%',
                            right: '12%',
                            // top: '10%',
                            height: '32%',
                        },
                    ],
                    tooltip: {
                        trigger: 'axis', //axis /item
                        // formatter函数动态修改tooltip样式
                        formatter: function (params) {
                            if (params) {
                                var htmlStr = '';
                                htmlStr += params[0].name.replace(/\-/g, '/') + '<br/>'; //x轴的名称
                                for (var i = 0; i < params.length; i++) {
                                    var param = params[i]; // 存一份item项
                                    var seriesName = param.seriesName; //图例名称
                                    var value = param.value; //y轴值
                                    var color = param.color; //图例颜色
                                    htmlStr += '<div>';
                                    htmlStr += '<span style="margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:5px;background-color:' + color + ';"></span>';
                                    //圆点后面显示的文本
                                    htmlStr += seriesName + ':' + value;
                                    switch (seriesName) {
                                        case '小件货物':
                                            htmlStr += ' ' + '件';
                                            break;
                                        case '网点负荷':
                                            htmlStr += ' ' + '%';
                                            break;
                                        case '大件货物':
                                            htmlStr += ' ' + '件';
                                            break;
                                        default:
                                            htmlStr += ' ';
                                    }
                                    htmlStr += '</div>';
                                }
                                return htmlStr;
                            } else {
                                return;
                            }
                        },
                        backgroundColor: '#ccc',
                        borderWidth: 1,
                        borderColor: '#ccc',
                        padding: 10,
                        textStyle: {
                            color: '#000',
                            fontSize: 12,
                            align: 'left',
                        },
                        // hideDelay: 10000, //延时消失时间
                    },
                    legend: {
                        show: true,
                        x: 'center',
                        y: '0',
                        data: ['小件货物', '网点负荷'],
                        textStyle: {
                            fontSize: 12,
                        },
                    },

                    xAxis: [
                        {
                            type: 'category',
                            scale: true,
                            axisLabel: {
                                show: false,
                            },
                            axisTick: {
                                alignWithLabel: true,
                            },
                            splitLine: {
                                show: false,
                            },
                            data: xData, //x轴时间的数据
                        },
                    ],
                    yAxis: [
                        {
                            type: 'value',
                            name: '件数',
                            nameLocation: 'center',
                            nameGap: 50,
                            nameTextStyle: {
                                fontSize: 12,
                                fontWeight: '500',
                            },
                            axisLabel: {
                                fontSize: 12,
                            },
                            min: function (value) {
                                return parseInt(value.min);
                            },
                            max: function (value) {
                                return parseInt(value.max * 1.05);
                            },
                            scale: false,
                            boundaryGap: [0, '100%'],
                            splitLine: {
                                show: false,
                            },
                            splitNumber: 4, //设置坐标轴的分割段数
                        },
                        {
                            type: 'value',
                            name: '负荷/百分比',
                            nameLocation: 'center',
                            nameGap: 42,
                            nameTextStyle: {
                                fontSize: 12,
                            },
                            axisLabel: {
                                fontSize: 12,
                            },
                            // min: function (value) {
                            //   return parseInt(value.min);
                            // },
                            // max: function (value) {
                            //   return parseInt(value.max * 1.05);
                            // },
                            scale: true,
                            boundaryGap: [0, '100%'],
                            splitLine: {
                                show: false,
                            },
                            splitNumber: 4, //设置坐标轴的分割段数
                        },
                    ],
                    dataZoom: [
                        {
                            type: 'inside',
                            startValue: y1Data.length - 4, // 放置最后4个数组
                            endValue: y1Data.length - 1,
                            xAxisIndex: [0, 1], // 显示 0 1 的数据,这个要加,不加的话,悬浮提示就会出问题
                        },
                    ],
                    series: [
                        {
                            name: '小件货物',
                            type: 'line',
                            xAxisIndex: 0,
                            yAxisIndex: 0,
                            hoverAnimation: true, // 悬浮的动画加上
                            data: y1Data, //小件货物
                            itemStyle: { normal: { label: { show: true } } },
                        },
                        {
                            name: '网点负荷',
                            type: 'line',
                            xAxisIndex: 0,
                            yAxisIndex: 1,
                            hoverAnimation: true, // 悬浮的动画加上
                            data: y2Data, //网点负荷
                        },
                    ],
                };

                myChart1.setOption(options);
                myChart2.setOption(options);

                // function autoTip() {
                //     timer = setTimeout(function () {
                //         //3.0以上版本的showTip使用方式
                //         //如何让三个点同时显示?
                //         myChart.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: 0 });
                //         myChart.dispatchAction({ type: 'showTip', seriesIndex: 1, dataIndex: 1 });
                //         myChart.dispatchAction({ type: 'showTip', seriesIndex: 2, dataIndex: 2 });
                //     }, 1000);
                // }
                // autoTip();

                myChart1.group = 'group1';
                myChart2.group = 'group1';
                echarts.connect('group1');
            };

            drawEcharts();
        </script>
    </body>
</html>

效果图:

参考: https://codesandbox.io/p/sandbox/series-layout-by-column-or-row-forked-g5vs4p?file=%2Findex.js%3A11%2C1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(栈stack)

文章目录 一、栈1、栈的定义2、顺序栈2.1、初始化2.2、进栈2.3、出栈2.4、读取 3、链栈 一、栈 1、栈的定义 逻辑结构&#xff1a;与普通线性表相同数据的运算&#xff1a;插入、删除操作有区别 2、顺序栈 2.1、初始化 ”.”适用于结构体变量&#xff0c;”->”适用于…

【算法专题】二分查找(入门)

&#x1f4d1;前言 本文主要是二分查找&#xff08;入门&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

探索元宇宙的未来:数字人对话系统 - Linly-Talker —— “数字人交互,与虚拟的自己互动”

探索元宇宙的未来&#xff1a;数字人对话系统 - Linly-Talker —— “数字人交互&#xff0c;与虚拟的自己互动” 之前空闲的时候我似乎已经写过了有关于数字人的两篇文章&#xff0c;今天更多的写这篇文章就是想探索一下元宇宙的未来&#xff0c;这种数字人对话系统能做什么&…

算法沉淀——双指针算法(leetcode真题剖析)

算法沉淀——双指针算法 01.移动零02.复写零03.快乐数04.盛最多水的容器05.有效三角形的个数06.和为s的两个数字07.三数之和08.四数之和 双指针算法&#xff08;Two Pointer Algorithm&#xff09;是一种常用于数组&#xff08;或链表&#xff09;操作的算法技巧。它的核心思想…

2024年1月的论文推荐

又到月底了&#xff0c;在月初推荐论文的基础上又整理了10篇推荐阅读的论文 1、MosaicBERT https://mosaicbert.github.io/ 一种用于快速预训练的双向编码器。MosaicBERT是针对快速预训练优化的自定义BERT架构。主要架构修改:FlashAttention, ALiBi&#xff0c;门控线性单元…

【JavaWeb程序】【C00150】基于SSM的二手交易平台管理系统-(论文+PPT)

基于SSM的二手交易平台管理系统-&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目包运行、免费远程调试 项目简介 这是一个基于ssm的二手交易平台管理系统 本系统分为用户和管理员两个模块。 其中用户的权限为&#xff1a;修改个人信息、闲置商…

log4j2 java api 入门介绍

概述 Log4j 2 API 提供了应用程序应该编码的接口&#xff0c;并提供了实现者创建日志实现所需的适配器组件。 虽然 Log4j 2 在 API 和实现之间被分解&#xff0c;但这样做的主要目的不是允许多个实现&#xff0c;尽管这当然是可能的&#xff0c;而是明确定义在“正常”应用程…

探索机器学习的奥秘

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 机器学习的定义二. 机器学习的发展历程三. 机器学习的原理四. 机器学习的分类…

路由、组件目录存放

文章目录 单页应用程序&#xff1a;SPA- Single Page Application路由的介绍VuePouter的介绍VueRouted 的使用 组件目录存放问题&#xff08;组件分类&#xff09; 单页应用程序&#xff1a;SPA- Single Page Application 单页应用&#xff08;SPA&#xff09;:所有功能在一个…

四. 基于环视Camera的BEV感知算法-BEVFormer实战

目录 前言1. BEVFormer实战 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Camera的BEV感知算法&#xff0c;一起去学习下 BEVFormer 的相关代码 课程…

MySQL之索引分类,语法以及SQL性能分析(慢日志,profile,explain)

索引分类 分类含义特定关键字主键索引针对于表中主键创建的索引默认自动创建&#xff0c;只能有一个PRIMARY唯一索引避免同一个表中某数据列中的值重复可以有多个UNIQUE常规索引快速定位特定数据可以有多个全文索引全文索引查找的文本中的关键字&#xff0c;而不是比较索引中的…

04.领域驱动设计:了解聚合和聚合根,怎样设计聚合

目录 1、概述 2、聚合 3、聚合根 4、怎么设计聚合 4.1 聚合的构建过程主要步骤 第 1 步&#xff1a;采用事件风暴。 第 2 步&#xff1a;选出聚合根。 第 3 步&#xff1a;找出与聚合根关联的所有紧密依赖的实体和值对象。 第 4 步&#xff1a;画出对象的引用和依赖模型…

web前端项目-五子棋【附源码】

五子棋&#xff08;人机对弈&#xff09; 本项目【五子棋】是一款人机对弈的策略型棋类游戏。可以选择落子方&#xff1b;游戏难度和是否显示落子次序。游戏双方分别使用黑白两色的棋子&#xff0c;在棋盘直线与横线的交叉点上进行对弈。五子棋可以促进大脑发育、提高思维能力…

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…

Docker—入门及Centos7安装

1、Docker入门 1.1、Docker是什么&#xff1f; Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build&#xff0c;Ship&#xff0c;and Run Any App,Anywhere”&#xff0c;也就是通过对应组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP&…

指数计算(填空)

解题思路&#xff1a; 7的2020次方很大&#xff0c;需要用BigInteger来进行运算。 pow用来算指数运算。 remainder用来算BigInteger之间的取余。 解题代码&#xff1a; public static void main(String[] args) {BigInteger xnew BigInteger ("7");BigInteger ynew…

Tools工具安装及模板制作

Tools工具&#xff1a; 如何安装tools 1、右键单击——tools——挂载tools 2、把光盘里面的内容挂载到系统的临时挂载目录里面 mount /dev/cdrom /mnt 先卸载光盘 安装zip包 ********************************************** 使用yum源 1、挂载光盘 2、配置yum 写文件 安装…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…

Vite+Vue3使用Vue-i8n笔记

一、下载依赖 vue-i18n yarn add vue-i18n创建存放语言文件的目录 以及配置文件的配置 我是在src/lang 新建index.ts、cn.ts、en.ts以及test文件夹其中再分别新建cn.ts以及en.ts /lang/index.ts 用于导出vue-i18n需要的配置对象 import en from "./en.ts"; import…

(八)循环控制中的break和continue关键字

文章目录 break提前结束整个循环示例代码现象 continue提前结束本次循环示例代码现象 break提前结束整个循环 示例 代码 #include <stdio.h>int main() {int numOfPerson ;int totalmoney 0;int money ;printf("这是一个使用break关键字的程序\n");for(numO…