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

一、效果图展示

先展示一下实际的效果图

用户选择完需要的波形参数字段之后,页面开始渲染图表,有几个参数就要渲染几个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);//这里设置true,会每次根据数据重新绘制,设置为false之后,每次新的绘制会在原有图表的基础上再添加(不会有断裂感,会形成流动感)
        })

        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)', // 设置白色的半透明背景

  • 43
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值