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

Bokeh多线条图表HoverTool异常:多工具框显示同一数值求助

解决Bokeh多线条HoverTool显示重复数值的问题

我之前也碰到过一模一样的坑!核心问题大概率是你没给每个HoverTool指定专属的线条渲染器,导致两个工具都默认绑定了同一条线,自然显示重复的数值。下面给你一套靠谱的实现方案,附详细解释:

关键思路

每个线条在Bokeh里对应一个GlyphRenderer对象,你需要给每个HoverTool明确指定它要作用的渲染器,同时确保tooltips里的字段和线条绑定的数据源字段严格对应。

完整示例代码

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

# 1. 构造示例数据(替换成你的真实数据)
dates = pd.date_range(start='2024-01-01', periods=10)
wind_data = np.random.randint(5, 20, size=10)
temp_data = np.random.randint(10, 30, size=10)

# 可以用同一个数据源,也可以给每条线单独建数据源
source = ColumnDataSource(data={
    'date': dates,
    'wind': wind_data,
    'temperature': temp_data
})

# 2. 创建画布,注意先清空默认tools避免冲突
p = figure(x_axis_type='datetime', title='Weather Data', tools='')

# 3. 绘制每条线,并保存对应的渲染器对象!这一步是核心
wind_line = p.line(x='date', y='wind', source=source, color='blue', legend_label='Wind Speed')
temp_line = p.line(x='date', y='temperature', source=source, color='red', legend_label='Temperature')

# 4. 为每条线创建专属HoverTool,指定renderers参数绑定对应线条
# 风速的HoverTool,只作用于wind_line
wind_hover = HoverTool(
    renderers=[wind_line],  # 关键:限定工具作用的线条
    tooltips=[
        ('日期', '@date{%Y-%m-%d}'),
        ('风速', '@wind mph')
    ],
    formatters={'@date': 'datetime'}  # 格式化日期显示
)

# 温度的HoverTool,只作用于temp_line
temp_hover = HoverTool(
    renderers=[temp_line],
    tooltips=[
        ('日期', '@date{%Y-%m-%d}'),
        ('温度', '@temperature °C')
    ],
    formatters={'@date': 'datetime'}
)

# 5. 将两个HoverTool添加到画布
p.add_tools(wind_hover, temp_hover)

# 显示图表
show(p)

你可能踩的坑

  1. 没保存线条渲染器:如果直接写p.line(...)而不把返回值存成变量,就没法给HoverTool指定renderers,导致所有HoverTool都作用于所有线条。
  2. 未指定renderers参数:默认情况下HoverTool会作用于所有渲染器,所以两个工具都会抓取同一段数据。
  3. 数据源字段不匹配:检查tooltips里的@xxx是否和数据源里的字段名完全一致,大小写也要严格对应!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:09:01