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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【办公类-23-01】20240128《百家姓》单姓与复姓

结果展示 背景需求&#xff1a; 20240128我去了苏州吴江的黎里古镇游玩&#xff0c;哪里有一面墙上都是百家姓做装饰。 这让我又想到我班级里的7个王姓的重姓率&#xff01; 【办公类-19-02-01】20240119统计班级幼儿姓名的长度、汉字重复、拼音重复&#xff08;有无声调&…

【ArcGIS遇上Python】python实现批量XY坐标生成shp点数据文件

单个手动生成:【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层 文章目录 一、问题分析二、解决办法三、注意事项一、问题分析 现有多个excel、txt或者csv格式的坐标数据,需要根据其坐标批量一键生成shp点数据,如下X为经度,…

回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测(含优化前后预测可视化)

回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测 目录 回归预测 | MATLAB实现PSO-GRNN粒子群优化广义回归神经网络多输入单输出预测预测效果基本介绍程序设计参考资料预测效果 <

力扣3. 无重复字符的最长子串(滑动窗口)

Problem: 3. 无重复字符的最长子串 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 由于题目要求求出字符串中最长的连续无重复字符的最长子串&#xff0c;所以利用这个特性我们可以比较容易的想到利用双指针中的滑动窗口技巧来解决&#xff0c;但在实际的求解中…

【学网攻】 第(14)节 -- 动态路由(EIGRP)

系列文章目录 目录 系列文章目录 文章目录 前言 一、动态路由EIGRP是什么&#xff1f; 二、实验 1.引入 实验步骤 实验拓扑图 实验配置 看到D开头是便是我们的EIGRP动态路由 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学…

微信小程序(二十二)获取全局实例

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.全局实例的定义位置 2.全局实例中数据的修改方法 源码&#xff1a; app.js App({//数据可以包括在第二级globalData:{userInfo:null,token:1243,userInfo:null},//globalData并不是关键词&#xff0c;数据可以…

WSL2 Debian系统添加支持SocketCAN

本人最近在使用WSL2&#xff0c;Linux系统选择的是Debian&#xff0c;用起来很不错&#xff0c;感觉可以代替VMware Player虚拟机。 但是WSL2 Debian默认不支持SocketCAN&#xff0c;这就有点坑了&#xff0c;由于本人经常要使用SocketCAN功能&#xff0c;所以决定让Debian支持…

菜谱的未来:SpringBoot, Vue与MySQL的智能推荐系统设计

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

[Python-贪心算法]

135. 分发糖果 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算…

Redis 面试题 | 18.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

数学知识第四期 快速幂

前言 快速幂在算法比赛中十分的重要&#xff0c;而且代码简短&#xff0c;清楚易懂&#xff0c;大家应该熟练掌握&#xff01;&#xff01;&#xff01; 一、什么是快速幂&#xff1f; 快速幂是一种高效的算法&#xff0c;用于计算某个数的n次幂。它的基本思想是将原式转换为…

JavaScript DOM属性和方法之element元素对象

在HTML DOM中&#xff0c;elment对象表示HTML与纳素&#xff0c;可以包含的节点类型有元素u节点、文本节点、注释节点。它们有响应的属性和方法&#xff0c;有很多都是我们之前用过的。 一、element对象属性 1、attributes 2、childNodes 3、className 4、clientWidth、of…

【大厂AI课学习笔记】1.1.4 学科和学习路径

一、8大学科 特点是特点 &#xff1a;厚基础、重交叉、宽口径。 八大学科分别是&#xff1a;数学与统计、科学与工程、计算机科学与技术、人工智能核心、认知与神经科学、先进机器人技术、人工智能工具与平台。 每个学科&#xff0c;又向下延伸。 MORE: AI&#xff0c;即人…

【DDD】学习笔记-限界上下文的控制力

引入限界上下文的目的&#xff0c;不在于如何划分&#xff0c;而在于如何控制边界。因此&#xff0c;我们就需要将对限界上下文的关注转移到对控制边界的理解。显然&#xff0c;对应于统一语言&#xff0c;限界上下文是语言的边界&#xff0c;对于领域模型&#xff0c;限界上下…

muduo网络库剖析——事件循环线程池EventLoopThreadPool类

muduo网络库剖析——线程Thread类 前情从muduo到my_muduo 概要框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多情况是否可以高效满足&#xff1b;而作为学习者&#xff0c;我们需要抽取其中的精…

Spring结合工厂模式

学习设计模式&#xff0c;不要进入一个误区生搬硬套&#xff0c;它是一种编程思想&#xff0c;结合实际使用&#xff0c;往往设计模式是混合使用的 工厂模式 核心本质&#xff1a;使用工厂统一管理对象的创建&#xff0c;将调用者跟实现类解耦 我这里使用Spring容器的支持&am…

latent-diffusion model环境配置--我转载的

latent-diffusion model环境配置&#xff0c;这可能是你能够找到的最细的博客了_latent diffusion model 训练 autoencoder-CSDN博客 前言 最近在研究diffusion模型&#xff0c;并对目前最火的stable-diffusion模型很感兴趣&#xff0c;又因为stable-diffusion是一种latent-di…

【QT+QGIS跨平台编译】之十五:【libTiff+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libTiff介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libTiff介绍 libTiff是一个用于处理TIFF图像文件格式的开源软件库。 TIFF(Tagged Image File Format)是一种灵活且广泛支持的图像文件格式,常用于存储照片和其他高质量图像。libTiff提供了一套…

Qt QPlainTextEdit高亮显示当前行

Qt QPlainTextEdit高亮显示当前行 文章目录 Qt QPlainTextEdit高亮显示当前行摘要错误的代码正确的代码QTextEdit::ExtraSelection 关键字&#xff1a; Qt、 QPlainTextEdit、 QTextBlock、 ExtraSelection、 GPT 摘要 今天要在说一下GPT&#xff0c;当下如果你还不会用G…

STM32读取MPU6050数据并通过角度值控制舵机运动(STM32、GY-521 MPU6050、SG90舵机、MG946舵机)

通过STM32F103C8T6读取MPU6050数据控制舵机运动&#xff08;STM32、GY-521 MPU6050、SG90舵机、MG946舵机&#xff09; 最终现象一、MPU6050数据读取二、舵机控制原理①什么是PWM&#xff1f;②STM32F103C8T6如何生成PWM&#xff1f;③控制舵机需要什么样的PWM波&#xff1f; 三…