前端-如何用echarts绘制含有多个分层的波形图

news2025/1/21 12:20:46

一、效果图展示

先展示一下实际的效果图

用户选择完需要的波形参数字段之后,页面开始渲染图表,有几个参数就要渲染几个grid,也就是几行波形。

二、绘制逻辑

拿到所选的参数数据之后

1.首先是给横坐标轴的里程-数据注入

2.修改tooltip(跟着竖线走的卡片弹窗)里面的弹出窗的显示,需要返回html模板字符串

3.修改datazoom(最底下的蓝色滑动窗),里面初始的起点和终点

4.按照参数的个数添加grid(每一行的波形),需要叠加计算的是,距离bottom的高度,一个距离100,2个距离200

5.按照参数的个数添加xAxis里面的对象   (需要修改 gridIndex 0 1 2 ...)
只有第一个对象,要显示X轴坐标,且同时要判断X轴坐标是否包含车站
第二个对象开始不显示xAxis坐标轴

6.修改y轴 (可显示刻度)(需要修改 gridIndex 0 1 2 ...)

7.最后修改series 每个参数是一个对象的配置(包括数据,线条的类型,颜色)


(值得注意的是,这套绘制,建议放置在一个函数里,然后加载时调用,重新绘制时调用,需要注意重新绘制时,除了要myChart.dispose(); //销毁,还要重新配置option)

三、关键代码

绘制逻辑代码:

const self = this;
          
          //重新给图标赋值数据
          this.tableData.forEach(function (currentValue, index, array) {
          
            // 4.按照参数的个数添加grid,需要叠加计算的是,距离bottom的高度,一个距离100,2个距离200
            let height = (index+1)*100;
            if(index===array.length-1){
              self.option.grid.push({
                show:true, 
                left: 50,
                right: 50,
                bottom: height,
                height: 100, //每一个折现图的高度
                backgroundColor: index % 2 === 1 ? '#f0f0f0' : 'white',  // 背景色
              })
            }else{
              self.option.grid.push({
                show:true, 
                left: 50,
                right: 50,
                bottom: height,
                height: 100, //每一个折现图的高度
                backgroundColor: index % 2 === 1 ? '#f0f0f0' : 'white',  // 背景色
              })
            }
            
            // 5.按照参数的个数添加xAxis里面的对象   (需要修改 gridIndex 0 1 2 ...)
            // !!!只有第一个对象,要显示X轴坐标,且同时要判断X轴坐标是否包含车站
            // 第二个对象开始不显示坐标轴
            if(index==0){
              self.option.xAxis.push({
                  gridIndex: 0, //x 轴所在的 grid 的索引
                  type: 'category', //类目轴
                  boundaryGap: false, //坐标轴两边留白策略,
                  axisLine: {
                    //是否显示坐标轴轴线。
                    onZero: false,
                    lineStyle: {
                      color: 'black',
                      width: 2,
                    },
                  },
                  //车站标注
                  axisLabel: {
                    // interval: 0,//自适应X轴间距
                    formatter: function (params) {
                      // 自定义div
                      // console.log(typeof(params))
                      let res;
                      if (params.includes('站')) {
                        res = '{abg11|' + params + '}';
                      } else {
                        res = '{abg1|' + params + '}';
                      }

                      return res;
                    },
                    rich: {
                      abg11: {
                        backgroundColor: '#2B8AFD',
                        width: '100%',
                        align: 'right',
                        height: 22,
                        borderRadius: 3,
                        padding: [2, 4, 2, 4],
                        color: '#ffffff',
                      },
                      abg1: {
                        color: '#595959',
                      },
                    },
                  },
                  data: xData,
                  show: true, //是否显示 x 轴。
                })
            }else{
              self.option.xAxis.push({
                  gridIndex: index, //x 轴所在的 grid 的索引
                  type: 'category', //类目轴
                  boundaryGap: false, //坐标轴两边留白策略,
                  axisLine: {
                    onZero: true, //X 轴的轴线是否在另一个轴的 0 刻度上,只有在另一个轴为数值轴且包含 0 刻度时有效。
                    lineStyle: {
                      color: '#979797',
                    },
                  },
                  data: xData,
                  show: true, //是否显示 x 轴。
                  axisTick: {
                    //坐标轴刻度相关设置
                    show: false,
                  },
                  axisLabel: {
                    //刻度标签
                    show: false,
                  },
                })
            }

            // 6.修改y轴 (可显示刻度)(需要修改 gridIndex 0 1 2 ...)
            self.option.yAxis.push({
                  gridIndex: index, //y 轴所在的 grid 的索引
                  type: 'value',
                  // name: "PM2.5",//纵坐标名字
                  // nameLocation: "middle",//纵坐标名字的位置
                  // nameGap: 30,//纵坐标名字与轴线之间的距离
                  position: 'left', //y轴的位置
                  inverse: false,
                  splitLine: {
                    //坐标轴在 grid 区域中的分割线
                    show: false,
                  },
                  axisLine: { 
                    //坐标轴轴线相关设置  竖着那一根
                    show: true,
                    lineStyle: {
                      color: '#979797',
                    },
                  },
                  axisTick: {
                    //坐标轴刻度相关设置
                    show: false,
                  },
                  axisLabel: {
                    //刻度标签
                    show: false,
                  },
                },)
            
            // 7.最后修改series 每个参数是一个对象
            self.option.series.push({
                  //参数的名字-数据注入
                  name: currentValue.name,
                  type: 'line',
                  color: self.colorArray[index],
                  // 设置不显示小圆圈
                  symbol: 'none',
                  showSymbol: false,
                  xAxisIndex: index, //使用的 x 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。
                  yAxisIndex: index, //使用的 y 轴的 index,在单个图表实例中存在多个 x 轴的时候有用。
                  symbolSize: 8, //标记的大小
                  //   hoverAnimation: false,
                  smooth: true, //平滑曲线
                  //每个grid的数据-数据注入
                  data: currentValue.data,
                  markLine: {
                    symbol: 'none', //去掉箭头
                    //最大值和最小值
                    data: [
                      {
                        // type: 'median', //中位数。
                        type: 'average', //中位数。
                        symbol: 'none', //去掉开始的原点
                        label: {
                          //字体设置
                          show: 'true',
                          position: 'insideEndTop',
                          distance: 10,
                          formatter: currentValue.name,
                          color: 'inherit',
                        },
                        lineStyle: {
                          //横线设置
                          width: 1,
                        },
                      },
                    ],
                  },
                  lineStyle: {
                    shadowColor: self.colorArray[index], //透明的颜色
                    shadowOffsetX: 0,
                    shadowOffsetY: 0,
                    opacity: 0.8, //透明度
                    shadowBlur: 8, //阴影大小
                    type: "solid", //实线
                    width: 2,
                  },
                })
          });
          
          this.getHeight(this.tableData.length)//重新获得动态的图表高度
          //折线图
          this.$nextTick(()=>{
            this.getChart();//实际绘制
          })

动态高度函数代码:

//获得动态高度
      getHeight(num){
        this.dynamicHeight = `${num * 100 + 150}px`;
      },

绘制代码:

//绘制折线图
      getChart() {
        const chartDom = document.getElementById('main-echarts');

        if (myChart != null && myChart != '' && myChart != undefined) {
          console.log("销毁了");
          myChart.dispose(); //销毁
        }

        // // 显示加载图
        // myChart.showLoading();

        this.$nextTick(()=>{
          myChart = echarts.init(chartDom);
          myChart.setOption(this.option, true);
        })

        window.addEventListener('resize', function () {
          myChart.resize();
        });
      }

 Y轴名字显示且竖直放置:

// 6.修改y轴 (可显示刻度)(需要修改 gridIndex 0 1 2 ...)
            self.option.yAxis.push({
                  gridIndex: index, //y 轴所在的 grid 的索引
                  type: 'value',
                  name: currentValue.name.toString().split("").join("\n"),//纵坐标名字竖直从上到下排列
                  nameRotate:0,
                  nameTextStyle: {
                      padding: 10, // 设置与坐标轴的距离,单位为像素
                      color: 'black', // 这里设置颜色
                  },
                  nameLocation: "middle",//纵坐标名字的位置
                  nameGap: 40,//纵坐标名字与轴线之间的距离
                  position: 'left', //y轴的位置
                  inverse: false,
                  splitLine: {
                    //坐标轴在 grid 区域中的分割线
                    show: false,
                  },
                  axisLine: { 
                    //坐标轴轴线相关设置  竖着那一根
                    show: true,
                    lineStyle: {
                      color: '#979797',
                    },
                  },
                  axisTick: {
                    //坐标轴刻度相关设置
                    show: false,
                  },
                  axisLabel: {
                    //刻度标签
                    show: true,
                    showMinLabel: false, // 隐藏最小值标签
                    showMaxLabel: false, // 隐藏最大值标签
                  },
                },)

弹窗显示为半透明

 this.option = {
          //鼠标放上去显示的弹窗
          tooltip: {
            trigger: 'axis', //坐标系出触发
            backgroundColor: 'rgba(255, 255, 255, 0.7)', // 设置白色的半透明背景

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

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

相关文章

鸿蒙开发者工具安装及入门程序

下载工具DevEco Studio IDE 官网下载:HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 开发工具的安装 解压下载好的压缩包,一路无脑安装即可,安装完的使用方法类似于IDEA、WebStorm的使用,快捷键一致,默认黑…

运算符号、算术运算符、赋值运算符、比较(关系)运算符、逻辑运算符、位运算符、条件运算符

运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 运算符的分类:按照功能分为:算术运算符、赋值运算符、比较(或关系)运算符、逻辑运算符、位运算符、条件运算符、Lambda运算符。 按照操作数的个数分为&am…

el-select如何去掉placeholder属性

功能要求是&#xff1a;当el-select的disabled属性为true的时候不展示“请选择”字样 1、要去掉 el-select 元素的 placeholder 属性&#xff0c;可以在代码中将其设置为空字符串。 <el-select placeholder"" ...></el-select> 注意&#xff1a;这种方…

多个bean获取同一个Service,获取的内存地址是同一块;引用bean地址存储在一个map中

public class UserService {public void test() {System.out.println("---test----");} } Testpublic void doesNotContain1(){// 创建Spring容器AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext();// 向容器中注册…

odoo17核心1——概述

odoo17发布了&#xff0c;如果说odoo16是一个承前启后的版本&#xff0c;那么odoo17则完全抛弃了历史包袱&#xff0c;全面简化了前端代码&#xff0c;是一个里程碑式的版本。 在学习odoo的过程中&#xff0c;结合对源码的阅读&#xff0c;对odoo的设计哲学有了一些自己的感悟…

【XR806开发板试用】通过http请求从心知天气网获取天气预报信息

1. 开发环境搭建 本次评测开发环境搭建在windows11的WSL2的Ubuntu20.04中&#xff0c;关于windows安装WSL2可以参考文章: Windows下安装Linux(Ubuntu20.04)子系统&#xff08;WSL&#xff09; (1) 在WSL的Ubuntu20.04下安装必要的工具的. 安装git: sudo apt-get install git …

桶装水送水小程序:提升服务质量的利器

随着移动互联网的发展&#xff0c;越来越多的消费者通过手机在线购物和订购商品。如果你是一名桶装水供应商&#xff0c;想要拓展线上业务&#xff0c;那么开发一个桶装水微信小程序将是一个明智的选择。本文将指导你从零开始开发一个桶装水微信小程序&#xff0c;让你轻松完成…

Google推出Gemini AI开发——10年工作经验的Android开发要被2年工作经验的淘汰了?

应用程序中利用 Gemini 前言&#xff08;可略过&#xff09;、使用 Gemini Pro 开发应用程序正文、Android Studio 中构建Gemini API Starter 应用第 1 步&#xff1a;在 AI 的新项目模板的基础上进行构建第 2 步&#xff1a;生成 API 密钥第 3 步&#xff1a;开始原型设计 正文…

2024年【安全生产监管人员】模拟考试题库及安全生产监管人员理论考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员模拟考试题库是安全生产模拟考试一点通总题库中生成的一套安全生产监管人员理论考试&#xff0c;安全生产模拟考试一点通上安全生产监管人员作业手机同步练习。2024年【安全生产监管人员】模拟考试题…

【小黑嵌入式系统第十二课】μC/OS-III程序设计基础(二)——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量

上一课&#xff1a; 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础&#xff08;一&#xff09;——任务设计、任务管理&#xff08;创建&基本状态&内部任务&#xff09;、任务调度、系统函数 文章目录 一、系统函数使用场合1.1 时间管理1.1.1 控制任务的执行周期1…

数据分析基础之《numpy(5)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

AndroidStudio无法新建Java工程解决办法

我用的 AS 版本是 Android Studio Giraffe | 2022.3.1 Build #AI-223.8836.35.2231.10406996, built on June 29, 2023 以往新建工程都是 New project >> Empty Activity &#xff0c; 有个选择 Java 还是 Kotlin 语言的选项&#xff0c; 之后会默认生成一个 MainActi…

DB207S-ASEMI迷你贴片整流桥DB207S

编辑&#xff1a;ll DB207S-ASEMI迷你贴片整流桥DB207S 型号&#xff1a;DB207S 品牌&#xff1a;ASEMI 封装&#xff1a;DBS-4 最大平均正向电流&#xff1a;2A 最大重复峰值反向电压&#xff1a;1000V 产品引线数量&#xff1a;4 产品内部芯片个数&#xff1a;4 产品…

【华为数据之道学习笔记】6-5数据地图的核心价值

数据供应者与消费者之间往往存在一种矛盾&#xff1a;供应者做了大量的数据治理工作、提供了大量的数据&#xff0c;但数据消费者却仍然不满意&#xff0c;他们始终认为在使用数据之前存在两个重大困难。 1&#xff09;找数难 企业的数据分散存储在上千个数据库、上百万张物理表…

JS逆向基础

JS逆向基础 一、什么是JS逆向&#xff1f;二、接口抓包三、逆向分析 一、什么是JS逆向&#xff1f; 我们在网站进行账号登录的时候对网页源进行抓包就会发现我们输入的密码在后台会显示为一串由字母或数字等符号&#xff0c;这就是经过加密呈现的一段加密文字&#xff0c;而分…

个人信息图片如何批量建码?批量图片二维码的方法

当我们需要给工作人员的证件图片批量生成二维码时&#xff0c;如何处理能够快速的将每张图片单独生成一张二维码使用呢&#xff1f;对于有这个需求的小伙伴来说&#xff0c;最快捷的方式可以用图片二维码生成器来处理&#xff0c;通过图片批量建码功能来完成制作&#xff0c;下…

【什么是泛型,有什么好处】

✅什么是泛型&#xff0c;有什么好处 ✅典型回答✅泛型是如何实现的✅什么是类型擦除&#xff1f;&#x1f4dd;C语言对泛型的支持&#x1f4dd;泛型擦除的缺点有哪些&#xff1f; ✅对泛型通配符的理解&#x1f4dd;泛型中上下界限定符 extends 和 super 有什么区别&#xff1…

YTM32的Flash控制器EFM模块详解

YTM32的Flash控制器EFM模块详解 文章目录 YTM32的Flash控制器EFM模块详解Flash存储器控制器EFM模块概述YTM32的Flash存储器特性Flash的约定术语存储器的地址空间及定义 使用Flash存储器擦写Flash的操作流操作Flash的时长 EFM的其他关于Flash的“骚操作”交换启动操作&#xff0…

IgH调试注意事项

1&#xff0c;不要在虚拟机测试&#xff0c;否则IgH无法收发数据包 现象&#xff1a;虚拟机中运行IgH master并绑定网卡后&#xff0c;主站由ORPHANED状态转换成IDLE状态&#xff0c;但无法收发数据报。 这是因为虚拟机用的是虚拟网卡&#xff0c;需通过iptables将数据包到转…

作为程序员,你知道 Notion 吗?

Notion 是一款极其出色的个人笔记软件&#xff0c;它将“万物皆对象”的思维运用到笔记中&#xff0c;让使用者可以天马行空地去创造、拖拽、链接。也适用于康奈尔笔记法哦。 不知大家会不会有如下烦恼&#xff1a; 1.当你下载了许多 APP&#xff0c;也注册了许多账号&#x…