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)
关键部分解释
@xs[$point_index]语法:通过$point_index从当前折线的xs数组中取出单个点的X值,ys和dates同理。- 日期格式化:因为
@dates[$point_index]返回的是单个日期对象,需要在formatters中指定datetime类型,并使用{%F}格式化为YYYY-MM-DD的形式。 mode和point_policy配置:设置mode='mouse'和point_policy='follow_mouse'可以确保HoverTool精准捕捉到鼠标附近的点,避免出现提示框不跟随的情况。
这样修改后,当你鼠标悬停在某个点上时,就能看到类似(xs:0, ys:1.47, color:green, date:2021-01-01)的单条点数据了。
内容的提问来源于stack exchange,提问作者AMH
相关产品推荐
相关产品推荐

