echarts 折线图标线 markline 还可以这样玩?

业务场景 :在数据量庞大的折叠折线图中,给其中一条添加两条水平的标线,标线的Y轴用户自定义,起点标记的图形用设计好的两个png小图片。 需求分析 :方案一:使用图例,也就是重新画一条折线图,折线图的x轴对应相同的一个y轴值,并设置虚线,但是...

这篇文章已从掘金同步到个人博客,原始发布地址为 掘金原文

业务场景:在数据量庞大的折叠折线图中,给其中一条添加两条水平的标线,标线的Y轴用户自定义,起点标记的图形用设计好的两个png小图片。

需求分析:方案一:使用图例,也就是重新画一条折线图,折线图的x轴对应相同的一个y轴值,并设置虚线,但是起始图标是个问题,该方案不可行。

方案二:使用折线图的 markline ,markline.data中放两个对象,一个对象表示一条水平线,markline.data.0.symbol 设置水平线的起始图标注意:这里不能直接导入静态的png图片,Echarts不能直接识别;

echarts水平标线起始图标-官方上传.png 我的做法是将png上传到官方 示例,官方示例会将你上传的png转换成 symbol: image://data:image/png;... 的图片,把它copy下来,放到你的项目中;

echarts水平标线起始图标-效果展示.gif

实现过程

<div id="demo">
      <!-- 折线图 -->
      <div style="height: 496px; border: 1px solid #ebeef5;">
        <v-chart id="performanceChart" :options="performanceOption" style="width: 100%; height: 100%;" />
      </div>
</div>
// 引包的代码我省略了,不是本文的重点
 this.performanceOption = {
        title: {
          text: "数据准备中",
          left: "center",
          top: "center",
          textStyle: {
            fontSize: 16,
            fontWeight: 400
          }
        },
        legend: [
          {
            data: legends,
            top: "2%",
            left: "25%",
            right: "10%",
            selected: this.selectedLegend
          },
          {
            data: ["数据4"],
            top: "73%",
            right: "0%"
          }
        ],
        dataZoom: [
          {
            id: "dataZoomX",
            type: "slider",
            xAxisIndex: [0, 1],
            height: 20,
            top: "65%",
            right: 10,
            left: 10,
            handleIcon:
              "M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z",
            handleSize: "80%",
            fillerColor: "rgba(255, 76, 31,.2)",
            dataBackground: {
              areaStyle: {
                color: ""
              },
              lineStyle: {
                opacity: 1,
                color: "#FF4C1F"
              }
            },
            handleStyle: {
              color: "#FF4C1F"
            },
            filterMode: "weakFilter",
            zoomOnMouseWheel: "false"
          }
        ],
        tooltip: {
          trigger: "axis",
          axisPointer: { type: "cross" },
          formatter: function (datas) {
            let res = datas[0].name + "<br/>";
            let length = datas.length;
            let i = 0;
            for (; i < length; i++) {
              res += `
              <span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${datas[i].color
                };"></span>
              ${datas[i].seriesName}: ${datas[i].value != null ? datas[i].value.toFixed(4) : "无数据"
                }
              <br/>
              `;
            }
            return res;
          }
        },
        axisPointer: {
          // 坐标轴指示器
          link: { xAxisIndex: "all" },
          label: { backgroundColor: "#777" }
        },
        grid: [
          {
            top: 40,
            left: 10,
            right: 0,
            bottom: 20,
            height: "60%"
          },
          {
            left: 10,
            right: 0,
            bottom: 15,
            height: "20%"
          }
        ],
        xAxis: [
          {
            type: "category",
            data: dts,
            axisLine: {
              show: true,
              lineStyle: {
                color: "#D8D8D8"
              }
            },
            axisTick: {
              show: false
            },
            axisLabel: {
              show: true,
              textStyle: {
                fontSize: 10,
                color: "#222831"
              }
            },
            splitLine: {
              show: false
            },
            scale: true
          },
          {
            type: "category",
            gridIndex: 1,
            data: dts,
            axisLine: {
              lineStyle: {
                color: "#D8D8D8"
              }
            },
            scale: true,
            axisTick: { show: false },
            splitLine: { show: false },
            axisLabel: { show: false }
          }
        ],
        yAxis: [
          {
            scale: true,
            splitArea: {
              show: false
            },
            splitNumber: 4,
            axisLabel: {
              show: true,
              textStyle: {
                fontSize: 10,
                color: "#808080",
                align: "left"
              }
            },
            axisLine: {
              show: false,
              lineStyle: {
                color: "#D8D8D8"
              }
            },
            axisTick: {
              show: false
            },
            splitLine: {
              show: true,
              lineStyle: {
                color: "#F5F5F5"
              }
            }
          },
          {
            type: "value",
            gridIndex: 1,
            offset: -10,
            axisLabel: {
              show: true,
              textStyle: { fontSize: 10, color: "#808080", align: "left" }
            },
            axisLine: { show: false },
            axisTick: { show: false },
            splitLine: { show: false }
          }
        ],
        series: [
          ...simulation, // 数据3
          ...fund_account, // 数据2
          {
            name: "数据1",
            type: "line",
            data: fundData.data,
            color: "#FF7979",
            symbol: false,
            symbolSize: 0, // 拐点圆的大小
            areaStyle: {
              // 折线渐变阴影
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                {
                  offset: 0,
                  color: "#FEE1E1"
                },
                {
                  offset: 0.76,
                  color: "#FFF8F8"
                }
              ])
            },
            // 🔔重点看这🔔重点看这🔔重点看这
            markLine: {
              lineStyle: { width: 2 }, // 标线大小
              symbol: "none", //去掉线最后面的箭头
              data: [{
                  name: '水平线1',
                  yAxis: 1, // Y 值为给定值的标记线,用户自定义水平标线的值
                  lineStyle: { color: "#FFAE00" },
                  symbol: "image://data:image/png;base64,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",
                  symbolKeepAspect: true,  // 是否在缩放时保持该图形的长宽比
                  symbolRotate: 1, // 起点标记的旋转角度
                  symbolSize: [25, 25]  // 起点标记的大小
                },
                {
                  name: '水平线2',
                  yAxis: 0.9, // Y 值为给定值的标记线,用户自定义水平标线的值
                  lineStyle: { color: "#FF4A00" },
                  symbol: "image://data:image/png;base64,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",
                  symbolKeepAspect: true,  // 是否在缩放时保持该图形的长宽比
                  symbolRotate: 1, // 起点标记的旋转角度
                  symbolSize: [25, 25]  // 起点标记的大小
                }
              ]
            }
          },
          {
            name: "数据4",
            type: "line",
            data: retracementData.data,
            color: "#6C9EF8",
            gridIndex: 1,
            xAxisIndex: 1,
            yAxisIndex: 1,
            symbolSize: 0, // 拐点圆的大小
            areaStyle: {
              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                {
                  offset: 0,
                  color: "rgba(115,156,250,0.05)"
                },
                {
                  offset: 0.76,
                  color: "rgba(115,156,250,0.25)"
                }
              ])
            }
          }
        ]
      };