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

Bokeh结合Pandas DataFrame时提示框不显示值及相关实现咨询

问题解答:Bokeh Tooltip显示???的原因及相关疑问

1. Tooltip显示???的根本原因

你碰到的问题核心是数据没有被Bokeh的交互工具纳入可识别的数据源。当你直接把pandas Series(比如my_df["Column1"])或者列表传给vbar的top参数时,Bokeh只会用这些数据渲染图形,但不会把Column1这个字段注册到绘图对象的数据源中。而HoverTool里的@Column1是在数据源里查找对应字段的,找不到就会显示???。

2. 为什么多数示例会用ColumnDataSource(my_df)

ColumnDataSource是Bokeh的核心数据容器,用它的原因主要有这几点:

  • 统一数据管理:把所有需要用到的数据(x轴、y轴、Tooltip字段等)集中在一个数据源里,让绘图元素和交互工具能直接通过字段名引用数据,避免数据分散导致的引用失败。
  • 支持复杂交互与动态更新:如果后续要做数据筛选、动态修改数据或者添加其他交互功能,ColumnDataSource能轻松支持这些操作,直接用列表/Series几乎没法实现。
  • 代码更规范易读:用数据源统一传递数据,代码结构更清晰,也符合Bokeh的设计逻辑,官方示例都是基于这个模式来展示的。

3. 可以不使用ColumnDataSource实现需求吗?

完全可以!有两种简单的实现方式:

方式一:直接引用top参数的值

因为你的top参数就是Column1的数值,所以可以直接在Tooltip里用@top来获取这个值,修改后的HoverTool代码如下:

hover = HoverTool(
    tooltips = [ ("index1", "@top") ]
)

这样HoverTool就能正确显示Column1的数值了。

方式二:给vbar添加自定义字段

你可以在调用vbar的时候,把Column1作为自定义参数传递,Bokeh会自动把这个字段加入到默认的临时数据源中,示例代码:

p.vbar(
    x=list(my_df.index.values),
    width=0.4,
    top=my_df["Column1"],
    column1=my_df["Column1"]  # 添加自定义字段
)
# 然后Tooltip引用这个自定义字段
hover = HoverTool(
    tooltips = [ ("index1", "@column1") ]
)

这种方式适合当你需要Tooltip展示的字段和top/x等参数不一致的场景。

不过要提醒一下:虽然不用ColumnDataSource能解决当前的简单需求,但如果后续需要更复杂的交互或数据操作,还是推荐使用ColumnDataSource,它能让你的代码扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:26:06