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,
      })
    }
  })

后续问题

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

  • 如果产品对性能有要求,获取最近一条数据的响应速度怎么提高,在鼠标快速滑动时仍能保证交互的流畅度?
  • 同时存在多条折线时怎么去实现上述的功能,并保证性能呢?
相关推荐
Book_熬夜!2 天前
Python基础(六)——PyEcharts数据可视化初级版
开发语言·python·信息可视化·echarts·数据可视化
范特西是只猫3 天前
echarts 自定义标注样式&自定义tooltip弹窗样式
前端·javascript·echarts
范特西是只猫3 天前
echarts map地图动态下钻,自定义标注,自定义tooltip弹窗【完整demo版本】
前端·javascript·echarts
人工智能的苟富贵4 天前
微信小程序中实现类似于 ECharts 的图表渲染及优化
微信小程序·小程序·echarts
GHUIJS4 天前
【Echarts】vue3打开echarts的正确方式
前端·vue.js·echarts·数据可视化
Peanuts.5 天前
VUE使用echarts编写甘特图(组件)
开发语言·javascript·echarts
GHUIJS7 天前
【Echarts】使用多横坐标轴展示近十五天天气预报
javascript·echarts
暖锋丫8 天前
echarts实现湖南省地图并且定时轮询
前端·javascript·echarts
时光匆匆岁月荏苒,转眼我们已不是当年8 天前
【前端echarts】echarts双饼图与easyui列表联动
前端·echarts·easyui
SnowMan19939 天前
高级 ECharts 技巧:自定义图表主题与样式
信息可视化·数据分析·echarts