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

Bokeh gridplot合并工具时工具栏指示器状态显示异常

Bokeh Gridplot工具栏指示器显示异常问题解答

问题1:现象是Bug还是操作错误?

这是Bokeh的已知Bug,并非操作方式有误。当使用gridplot并设置merge_tools=True时,合并后的工具栏在初始化阶段会出现视觉状态与代码设置不一致的问题——工具的实际功能完全符合代码配置,但工具栏上的激活状态指示器显示异常,多次点击工具后能触发状态同步,属于前端渲染时的状态同步逻辑遗漏。

问题2:通用优雅的解决方案

不需要硬编码状态,我们可以基于子图的原始工具配置,自动同步合并后工具栏的代理工具状态。以下是通用实现方案:

from bokeh.layouts import gridplot
from bokeh.plotting import figure, show
from bokeh.models import HoverTool, ToolProxy
from bokeh.io import output_notebook
output_notebook()

x = list(range(11))
y0 = x
y1 = [10 - i for i in x]
y2 = [abs(i - 5) for i in x]

# 创建三个子图(保持原代码配置)
s1 = figure(
    background_fill_color="#fafafa",
    active_scroll="wheel_zoom",
    active_inspect=None,
    width=300,
    height=300,
)
s1.circle(x, y0, size=12, alpha=0.8, color="#53777a")
s1.add_tools(HoverTool())

s2 = figure(
    background_fill_color="#fafafa",
    active_scroll="wheel_zoom",
    active_inspect=None,
    width=300,
    height=300,
)
s2.triangle(x, y1, size=12, alpha=0.8, color="#c02942")
s2.add_tools(HoverTool())

s3 = figure(
    background_fill_color="#fafafa",
    active_scroll="wheel_zoom",
    active_inspect=None,
    width=300,
    height=300,
)
s3.square(x, y2, size=12, alpha=0.8, color="#d95b43")
s3.add_tools(HoverTool())

# 创建网格
grid = gridplot([[s2, s3]], width=300, height=300, merge_tools=True, toolbar_location='right')

# 同步工具栏状态的通用逻辑
def sync_grid_toolbar_state(grid):
    # 获取合并后的工具栏
    toolbar = grid.toolbar
    if not toolbar or not hasattr(toolbar, 'tools'):
        return
    
    # 取第一个子图的工具状态作为基准(所有子图配置一致的场景)
    # 若子图配置不同,可根据需求调整同步逻辑
    first_plot = grid.children[0].children[0]
    # 同步scroll类工具状态
    if first_plot.active_scroll:
        for tool in toolbar.tools:
            if isinstance(tool, ToolProxy) and tool.proxy_name == first_plot.active_scroll.name:
                tool.active = True
    # 同步inspect类工具状态(这里以HoverTool为例)
    if first_plot.active_inspect is None:
        for tool in toolbar.tools:
            if isinstance(tool, ToolProxy) and isinstance(tool.tool, HoverTool):
                tool.active = False

# 执行状态同步
sync_grid_toolbar_state(grid)

show(s1)
show(grid)

方案说明:

  • 该方案通过读取子图的原始配置(active_scroll、active_inspect),自动匹配合并后工具栏中的ToolProxy并设置对应激活状态
  • 若子图间工具配置不同,可扩展逻辑(比如根据选中子图动态同步,或自定义规则)
  • 避免硬编码工具名称,适配不同工具类型和配置场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:10:28