echarts 参考线实现数据项之间的差异值标注

这是一个项目中经常用到的参考线高阶用法,主要是实现 echarts 图形中数据项之间的差异值标注参考线

效果图

实现原理

通过 echarts 的官方文档 markLine.data 可知,参考线的配置可以通过二维数组 来配置参考线的起点和终点,同时结合 markLine.data.coord 可知通过配置 coord 可以控制参考线只显示在图形的某个局部区域(即在指定的两个维度值之间绘制参考线),结合以上分析,可以得出绘制两个数据项之间的差异值参考线的实现步骤:

  1. 获取到需要对比差异值的数据项维度索引位置(dimIdx_start, dimIdx_end)和指标值(measureVal_start, measureVal_end)

  2. 绘制起始和结束标注参考线

    js 复制代码
    [
        // 起始参考线
        [
          {
            symbolSize: 0,
            lineStyle: {
              color: 'red',
            },
            coord: [dimIdx_start, measureVal_start],
          },
          {
            symbolSize: 0,
            lineStyle: {
              color: 'red',
            },
            coord: [dimIdx_end, measureVal_start],
          },
        ],
        // 结束参考线
        [
          {
            symbolSize: 0,
            lineStyle: {
              color: 'red',
            },
            coord: [dimIdx_start, measureVal_end],
          },
          {
            symbolSize: 0,
            lineStyle: {
              color: 'red',
            },
            coord: [dimIdx_end, measureVal_end],
          },
        ],
      ]
  3. 绘制差异值对比标注参考线

    js 复制代码
    [
      // ... 前面步骤绘制好的参考线
      // 差异值对比标注参考线
      [
        {
          symbolSize: 10,
          lineStyle: {
            color: "red",
          },
          // 找到数值较小的维度值,确保有足够的空白空间显示差异值标注
          coord: [
            measureVal_end > measureVal_start ? dimIdx_start : dimIdx_end,
            measureVal_start,
          ],
          symbol: "arrow",
          // 取绝对值
          name: Math.abs(measureVal_end - measureVal_start) + '',
          label: {
            position: "middle",
            color: "red",
          },
        },
        {
          symbolSize: 10,
          lineStyle: {
            color: "red",
          },
          coord: [
            measureVal_end > measureVal_start ? dimIdx_start : dimIdx_end,
            measureVal_end,
          ],
          symbol: "arrow",
        },
      ],
    ]
  4. 如果是同个数据项内的不同 series 之间绘制参考线,此时需要借助 symbolOffset 来实现,否则参考线会以为内起点和终点位置一致导致无法绘制出来,参考代码如下

    js 复制代码
    [
        [
            {
              // 不同 series 之间同个数据项需要配置 symbolOffset 来实现局部绘制
              symbolSize: [1, 40],
              symbolOffset: [0, -20],
              lineStyle: {
                color: 'red'
              },
              coord: [dimIdx_start, measureVal_start],
              symbol: 'rect'
            },
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              // 同个数据项,维度的索引起始和结束位置应该是相等的
              coord: [dimIdx_end, measureVal_start]
            }
          ]
    ]

完整 echarts 配置

在线示例环境可以看 demo

js 复制代码
option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [120, 200, 150, 80, 70, 110, 130],
      markLine: {
        // 同个 series 内不同数据项之间的差异值标注参考线
        data: [
          [
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              coord: [0, 120]
            },
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              coord: [1, 120]
            }
          ],
          [
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              coord: [0, 200]
            },
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              coord: [1, 200]
            }
          ],
          [
            {
              symbolSize: 10,
              lineStyle: {
                color: 'red'
              },
              coord: [0, 120],
              symbol: 'arrow',
              name: 200-120 + '',
              label: {
                position: 'middle',
                color: 'red'
              }
            },
            {
              symbolSize: 10,
              lineStyle: {
                color: 'red'
              },
              coord: [0, 200],
              symbol: 'arrow'
            }
          ]
        ],
        show: true
      },
      type: 'bar'
    },
    {
      data: [120, 180, 130, 80, 70, 110, 130],
      markLine: {
        // 同个数据项不同 series 之间的差异值数值标注
        data: [
          [
            {
              // 不同 series 之间同个数据项需要配置 symbolOffset 来实现局部绘制
              symbolSize: [1, 40],
              symbolOffset: [0, -20],
              lineStyle: {
                color: 'red'
              },
              coord: [2, 150],
              symbol: 'rect'
            },
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              coord: [2, 150]
            }
          ],
          [
            {
              symbolSize: [1, 40],
              symbolOffset: [0, -20],
              lineStyle: {
                color: 'red'
              },
              coord: [2, 130],
              symbol: 'rect'
            },
            {
              symbolSize: 0,
              lineStyle: {
                color: 'red'
              },
              coord: [2, 130]
            }
          ],
          [
            {
              symbolSize: 10,
              lineStyle: {
                color: 'red'
              },
              coord: [2, 150],
              symbol: 'arrow',
              name: '20',
              label: {
                color: 'red',
                position: 'middle'
              }
            },
            {
              symbolSize: 10,
              lineStyle: {
                color: 'red'
              },
              coord: [2, 130]
            }
          ],
        ],
        show: true
      },
      type: 'bar'
    }
  ]
};
相关推荐
小兵张健3 小时前
价值1000的 AI 工作流:Codex 通用前端协作模式
前端·aigc·ai编程
sunny_3 小时前
面试踩大坑!同一段 Node.js 代码,CJS 和 ESM 的执行顺序居然是反的?!99% 的人都答错了
前端·面试·node.js
拉不动的猪4 小时前
移动端调试工具VConsole初始化时的加载阻塞问题
前端·javascript·微信小程序
ayqy贾杰5 小时前
Agent First Engineering
前端·vue.js·面试
IT_陈寒6 小时前
SpringBoot实战:5个让你的API性能翻倍的隐藏技巧
前端·人工智能·后端
iceiceiceice6 小时前
iOS PDF阅读器段评实现:如何从 PDFSelection 精准还原一个自然段
前端·人工智能·ios
大金乄6 小时前
封装一个vue2的elementUI 表格组件(包含表格编辑以及多级表头)
前端·javascript
葡萄城技术团队7 小时前
【性能优化篇】面对万行数据也不卡顿?揭秘协同服务器的“片段机制 (Fragments)”
前端
程序员阿峰7 小时前
2026前端必备:TensorFlow.js,浏览器里的AI引擎,不写Python也能玩转智能
前端
Jans7 小时前
Shipfe — Rust 写的前端静态部署工具:一条命令上线 + 零停机 + 可回滚 + 自动清理
前端