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

如何同时触发多个Bokeh图表的Hover及Tooltip功能?

解决Bokeh多图表同步Tooltip显示问题

要实现共享Y轴的多个图表在CrosshairTool触发时同步显示Tooltip,可通过以下方式修改代码:

核心思路

让HoverTool关联对应图表的渲染器,同时开启跨图表同步触发,配合共享的CrosshairTool,实现十字准线移动时所有图表的Tooltip同时显示。

修改后的完整代码

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

df = pd.DataFrame({
    'depth': np.linspace(1000,1100,201),
    'x1': np.linspace(80,90,201)+np.random.rand(201),
    'x2': np.linspace(2.5,3.5,201)+np.random.rand(201)/10
})

source = ColumnDataSource(df)

p1 = figure(y_range=(df['depth'].max(),df['depth'].min()),
            width=400,height=600,y_axis_label='Depth (m)')
p2 = figure(y_range=p1.y_range,width=400, height=600)

# 绘制线条并保存渲染器对象,用于绑定HoverTool
line1 = p1.line('x1','depth',source=source, line_width=2, color='blue')
line2 = p2.line('x2','depth',source=source, line_width=2, color='green')

# 创建共享的CrosshairTool,保证十字准线同步
xspan = Span(dimension="width",line_width=0.5)
crosshair = CrosshairTool(overlay=xspan)
p1.add_tools(crosshair)
p2.add_tools(crosshair)

# 配置两个HoverTool,分别对应不同图表的线条,开启同步触发
hover1 = HoverTool(
    renderers=[line1],
    tooltips=[('', '@depth{0.0} m'),('', '@x1{0.0} °C')],
    mode='hline',
    attachment="above",
    shared=True
)

hover2 = HoverTool(
    renderers=[line2],
    tooltips=[('','@depth{0.00} m'),('','@x2{0.00} µs/ft')],
    mode='hline',
    attachment="above",
    shared=True
)

p1.add_tools(hover1)
p2.add_tools(hover2)

layout = row(p1,p2)
show(layout)

关键修改点

  • 保存线条渲染器:绘制线条时保留返回的line1、line2对象,用于绑定对应HoverTool,确保Tooltip只关联目标图表的数据。
  • 开启shared=True:让HoverTool在共享数据源的图表间同步触发,只要鼠标悬停在Crosshair位置,所有关联的Tooltip都会显示。
  • 共享Crosshair实例:两个图表使用同一个CrosshairTool和Span,保证十字准线在所有图表中同步移动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:54:51