Echarts tooltip 吸附

起因

在一些特殊情况下,给图表提供的数据的时间是随机或者有偏差的,但是又需要能够按时间正确的展示数据。比方说,现在有一个折线图,从0点到24点,每个点都需要出现在对应的位置、即对应的时分秒上,这个时候就需要补点了。

补点的代码就不贴了,简单来说就是按展示粒度在横坐标上生成点,比如:如果数据按秒展示,时间跨度为1天的折线图上横坐标会有60*60*24=86400个点。点补好了之后,再搭配series-line.connectNulls就能展示一个点不连续的折线图了。

折线图虽然画好了,但是零星的点散落在图上各处,并且可被触发的区间极小,正常情况下鼠标从左到到右移动一遍都不一定能触发一次tooltip

思路

鼠标在图表上移动时获取位置信息并转换成横坐标的索引,再从数据列表去搜索最近一个存在数据的项的索引,根据索引把这一项的tooltip给展示出来。

解决方案

javascript 复制代码
// lineChart 为 echarts 实例
// 通过 getZr().on('mousemove') 获取鼠标在图表上移动时的位置信息
lineChart.getZr().on('mousemove', params => {
    const pointInPixel = [params.offsetX, params.offsetY]
    // 使用 convertFromPixel 获取鼠标所在位置对应的横坐标的索引(currentIndex)
    const pointInGrid = lineChart.convertFromPixel({ seriesIndex: 0 }, pointInPixel)
    const currentIndex = pointInGrid[0];

    // 获取最近的一条数据的横坐标索引(closestIndex),
    // 最简单的方案就是遍历,这里不贴具体代码了
    // closestIndex = x

    // 如果能找到数据,调用 dispatchAction 展示对应数据的 tooltip
    if (closestIndex > -1) {
      lineChart.dispatchAction({
        type: 'showTip',
        seriesIndex: 0,
        dataIndex: closestIndex,
      })
    }
  })

后续问题

以上的实现应付简单折线图够用了,但是有几个问题可供思考:

  • 如果产品对性能有要求,获取最近一条数据的响应速度怎么提高,在鼠标快速滑动时仍能保证交互的流畅度?
  • 同时存在多条折线时怎么去实现上述的功能,并保证性能呢?
相关推荐
胡八一11 小时前
如何在 Dialog 中安全初始化 ECharts 并自动监听容器大小变化
前端·安全·echarts
图表制作解说(目标1000个图表)21 小时前
ECharts散点图-散点图15,附视频讲解与代码下载
echarts·统计分析·数据可视化·散点图·大屏可视化
沉迷...1 天前
手动实现legend 与 echarts图交互 通过js事件实现图标某项的高亮 显示与隐藏
前端·javascript·echarts
晚风3082 天前
el-tab组件与echarts的影响
echarts·element
serve the people3 天前
vue中将elementUI和echarts转成pdf文件
vue.js·elementui·echarts
图表制作解说(目标1000个图表)4 天前
ECharts散点图-散点图13,附视频讲解与代码下载
echarts·统计分析·数据可视化·散点图·大屏可视化
Danny_FD4 天前
ECharts中的markPoint使用,最大值,最小值,展示label数值
前端·echarts
雪梅零落4 天前
Echart 地图放大缩小
echarts
图表制作解说(目标1000个图表)4 天前
ECharts散点图-散点图14,附视频讲解与代码下载
echarts·统计分析·数据可视化·散点图·大屏可视化
三天不学习5 天前
基于 Vue3 + ECharts + GeoJson 实现区域地图钻取功能详解
前端·javascript·echarts·geojson·区域地图·钻地图