You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bokeh 2.3.0中multi_line组件的HoverTool如何显示点坐标而非源数组?

解决Bokeh multi_line组件HoverTool显示逐点数据的问题

这个问题我之前也遇到过,确实是multi_line和普通line组件在HoverTool处理上的差异导致的——因为multi_line的数据源是数组的数组,默认HoverTool会把整个数组渲染出来,而不是你需要的单个点数据。不过好在Bokeh提供了特殊变量来解决这个问题,不需要修改数据源结构就能实现逐点提示。

核心思路

Bokeh针对multi_line提供了两个特殊变量,用来定位当前悬停的点:

  • $index:当前悬停的折线在数据源中的索引(对应你定义的xs/ys/dates列表中的某一项)
  • $point_index:当前点在所属折线数组中的位置索引

通过这两个变量,我们可以从数组列表中提取出单个点的对应值,而不是整个数组。

修改后的完整代码

import pandas as pd
import numpy as np
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, HoverTool

xs = [np.arange(0,10) for _ in range(3)]
ys = [(np.random.randn(10) + i).round(2) for i in range(3)]
dates = [pd.date_range("2021-01-01", "2021-01-10") for _ in range(3)]
colors = ["red", "blue", "green"]

source = ColumnDataSource(dict(xs=xs, ys=ys, dates=dates, colors=colors))
p = figure(plot_width=750, plot_height=300)
p.multi_line(xs="xs", ys="ys", color="colors", source=source)

# 关键修改:使用$point_index提取单个点数据,同时配置日期格式化
hover = HoverTool(
    tooltips=[
        ("xs", "@xs[$point_index]"),
        ("ys", "@ys[$point_index]"),
        ("color", "@colors"),
        ("date", "@dates[$point_index]{%F}")
    ],
    formatters={
        "@dates[$point_index]": "datetime"  # 指定日期格式
    },
    mode='mouse',  # 让提示框跟随鼠标位置,捕捉最近的点
    point_policy='follow_mouse'
)
p.add_tools(hover)
show(p)

关键部分解释

  1. @xs[$point_index]语法:通过$point_index从当前折线的xs数组中取出单个点的X值,ys和dates同理。
  2. 日期格式化:因为@dates[$point_index]返回的是单个日期对象,需要在formatters中指定datetime类型,并使用{%F}格式化为YYYY-MM-DD的形式。
  3. mode和point_policy配置:设置mode='mouse'和point_policy='follow_mouse'可以确保HoverTool精准捕捉到鼠标附近的点,避免出现提示框不跟随的情况。

这样修改后,当你鼠标悬停在某个点上时,就能看到类似(xs:0, ys:1.47, color:green, date:2021-01-01)的单条点数据了。

内容的提问来源于stack exchange,提问作者AMH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:18:11