Echarts 指示器十字焦点固定在折线(数据)上

一开始设置Echarts的指示器axisPointer,
焦点是跟着鼠标点击的位置,但是期望的焦点是在红色折线上,如下图所示
在这里插入图片描述

axisPointer设置的关键代码:

tooltip: {
        trigger: "axis",
        triggerOn: "mousemove",
        position: [-5, 0],
        axisPointer: {
          type: "cross",
          snap: true,
          label: {
            show: false,
          },
        },
        transitionDuration: 0,
        backgroundColor: "#FFFFFF",
        textStyle: {
          color: "#3C3C3C", // 设置文字颜色
          fontSize: 12,
          lineHeight: 20,
        },
}

查了下官方文档,没有看到可以设置axisPointer位置的属性,最后决定使用markLine来绘制axisPointer中横线

大概思路是先修改axisPointer的tpye为"line"(即只展示竖线),然后监听Echarts的mousemove、mousedown事件,根据鼠标位置获取坐标轴中对应的数据,改变markLine的位置,重新setOption(绘制横线)

解决步骤:
①修改axisPointer的tpye为"line"

②配置初始markLine,配置可参考官方markLine配置详情
设置样式(去掉箭头,改为虚线,hover不加粗等…根据需求),data为空

series: [
        {
          name: "收益率",
          type: "line",
          lineStyle: {
            width: 1,
          },
          itemStyle: {
            normal: {
              color: "#FF674D",
            },
          },
          symbol: "none",
          data: yData,
          // 下面的markLine才是相关代码
          markLine: {
            symbol: "none", //去掉箭头
            animation: false,
            label: {
              show: false,
            },
            lineStyle: {
              color: "black",
              type: "dashed",
              width: 1, // 正常时的折线宽度
            },
            emphasis: {
              label: {
                show: false,
              },
              lineStyle: {
                color: "black",
                type: "dashed",
                width: 1, // hover时的折线宽度
              },
            },
            data: [],
          }
        },
    ],

③Echarts添加监听事件

this.lineEchart.getZr().on("mousemove", (params) => {
          // 获取点击位置的坐标
          let pointInPixel = [params.offsetX, params.offsetY];
          // containPixel为true则点击位置在坐标轴内
          if (this.lineEchart.containPixel("grid", pointInPixel)) {
            // 传入鼠标位置坐标进行转化
            // convertFromPixel返回[x, y],x对应鼠标点击处数据的下标,y对应鼠标点击处的数值
            const x = this.lineEchart.convertFromPixel({ seriesIndex: 0 }, pointInPixel)[0];
            // series[0].data[x]是第一条折线上的数据
            const markLineValue = lineChartOptions.series[0].data[x];
            let series = lineChartOptions.series;
            // 修改markLine的值
            series[0].markLine.data = [{ yAxis: markLineValue }];
            // 重新setOption
            this.lineEchart.setOption({ series }, { lazyUpdate: true });
          } else {
            // 不在坐标轴内不展示markLine
            let series = lineChartOptions.series;
            series[0].markLine.data = [];
            this.lineEchart.setOption(
              {
                series,
              },
              { lazyUpdate: true }
            );
          }
});

注释都写在代码里面了,convertFromPixel获取点击处的数据下标x,之后再获取折线数据:yData[x](我这里直接从option里面取了,lineChartOptions.series[0].data[x]),再更新markLine的值,就能绘制出markLine(横线)固定在折线的效果

想了解更多可以去看看官方文档
containPixel。判断给定的点是否在指定的坐标系或者系列上;
convertFromPixel。转换像素坐标值到逻辑坐标系上的点;
setOption。每次监听mousemove都重新setOption,会导致Echarts很卡,听同事的建议,增加设置了lazyUpdate:true属性,有所缓解。

效果图如下:
在这里插入图片描述

至此,问题大概就解决了,大佬们有什么问题欢迎指出。

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
引用\[1\]:要实现Echarts十字准星指示器,可以先修改axisPointer的type为"line",然后监听Echarts的mousemove、mousedown事件,根据鼠标位置获取坐标轴中对应的数据,改变markLine的位置,重新setOption(绘制横线)。\[1\] 引用\[2\]:在使用pyecharts时,可以通过设置tooltip_opts参数来实现十字准星指示器。具体的代码如下所示: ```python import pyecharts as pct from pyecharts import options as opts x_data = \['Apple', 'Huawei', 'Xiaomi', 'Oppo', 'Vivo', 'Meizu'\] y_data = \[123, 153, 89, 107, 98, 23\] line = pct.charts.Line() line.add_xaxis(x_data) line.add_yaxis('', y_data) tooltip_opts = opts.TooltipOpts(is_show=True, trigger_on="mousemove | click", axis_pointer_type='cross') line.set_global_opts(tooltip_opts=tooltip_opts) line.render() ``` 这段代码会生成一个带有十字准星指示器折线图。\[2\] 引用\[3\]:如果使用原生的echarts库,可以通过设置tooltip的trigger为'axis',并且设置axisPointer的type为'shadow'来实现十字准星指示器。具体的代码如下所示: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Tooltip组件</title> <!-- 引入 echarts.js --> <script src="../js/echarts.js"></script> </head> <body> <!-- 为ECharts准备一个具备大小(宽高)的Dom --> <div id="main" style="width: 600px;height:400px;"></div> <script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 指定图表的配置项和数据 var option = { title: { text: '这是主标题', subtext: '这是副标题', left: 'center' // 居中对齐 }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } }, legend: { data: \['各产品销量情况'\] }, xAxis: { data: \["产品A", "产品B", "产品C", "产品D", "产品E"\] }, yAxis: {}, series: \[{ name: '销量', type: 'bar', data: \[900, 700, 550, 1000, 200\] }\] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> </body> </html> ``` 这段代码会生成一个带有十字准星指示器的柱状图。\[3\] #### 引用[.reference_title] - *1* [Echarts 指示器十字焦点固定折线数据)上](https://blog.csdn.net/m0_59354754/article/details/118549034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [【Pyecharts】使用十字准星指示器(鼠标移动出现十字交叉并自动吸附)](https://blog.csdn.net/youduba7/article/details/118875193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [Echarts数据可视化 第3章 Echarts组件详解 3.2 提示框](https://blog.csdn.net/weixin_44226181/article/details/129312916)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值