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

Bokeh vbar悬停工具问题:多数据非堆叠柱状图悬停显示最大值

解决Bokeh多数据非堆叠柱状图悬停显示最大值的问题

我懂你现在的困扰啦——用Bokeh做多数据非堆叠柱状图时,想让鼠标悬停在柱子上显示对应分组的最大值,但不知道怎么把悬停位置和数据索引关联起来。别担心,咱们一步步来搞定这个问题!

核心思路

问题的关键在于:要把每个柱子需要显示的最大值提前存入数据源(ColumnDataSource),这样HoverTool就能直接通过字段引用获取对应的值,不需要动态去索引计算。下面是完整的修改示例代码,我会帮你拆解关键步骤:

from bokeh.io import show, output_file
from bokeh.models import ColumnDataSource, FactorRange, HoverTool
from bokeh.plotting import figure

output_file("bars.html")

# 定义你的位置和类别(补全你没写完的部分)
LOCATIONS = ['CPC','OG2','HS82']
CATEGORIES = ['类别1', '类别2', '类别3']

# 模拟你的原始数据:每个位置+类别对应的数值
raw_data = {
    'locations': [loc for loc in LOCATIONS for _ in CATEGORIES],
    'categories': [cat for _ in LOCATIONS for cat in CATEGORIES],
    'values': [12, 18, 9, 15, 11, 20, 8, 14, 16]
}

# 第一步:计算每个位置的最大值(如果要类别最大值,逻辑类似)
location_max_values = {}
for loc in LOCATIONS:
    # 筛选当前位置的所有数值,取最大值
    loc_data = [v for l, v in zip(raw_data['locations'], raw_data['values']) if l == loc]
    location_max_values[loc] = max(loc_data)

# 把最大值加入原始数据,每个柱子对应所属位置的最大值
raw_data['group_max'] = [location_max_values[loc] for loc in raw_data['locations']]

# 第二步:构建FactorRange需要的x轴元组(位置+类别)
x_axis = list(zip(raw_data['locations'], raw_data['categories']))
source = ColumnDataSource(data=raw_data)

# 创建图表
p = figure(
    x_range=FactorRange(*x_axis),
    height=350,
    title="多数据非堆叠柱状图",
    toolbar_location="right"
)

# 绘制柱状图,x轴绑定我们构建的x_axis字段
p.vbar(x='x', top='values', width=0.8, source=source)

# 第三步:配置HoverTool,直接引用数据源里的字段
hover_tool = HoverTool(
    tooltips=[
        ('位置', '@locations'),
        ('类别', '@categories'),
        ('当前数值', '@values'),
        ('该位置最大值', '@group_max')
    ],
    # 只在柱子上触发悬停
    mode='vline'
)
p.add_tools(hover_tool)

# 优化x轴标签显示
p.xaxis.major_label_orientation = 1.2
p.y_range.start = 0

show(p)

关键步骤拆解

  1. 给数据源补充最大值字段:
    我们先遍历每个位置,计算出该位置的最大值,然后把这个值对应到每一行数据中。这样每个柱子的数据源行里都包含了所属分组的最大值,HoverTool可以直接读取。

  2. 正确绑定FactorRange的x轴:
    用zip把位置和类别组合成元组,作为x轴的刻度,同时把这个元组列表作为数据源的x字段,确保每个柱子和x轴刻度一一对应,不会出现索引错位。

  3. 配置HoverTool:
    通过@字段名的方式直接引用数据源里的字段,这样鼠标悬停时,Bokeh会自动匹配当前柱子对应的行数据,显示你需要的所有信息。如果需要显示类别级别的最大值,只需要修改计算最大值的逻辑(遍历类别而非位置)即可。

这样调整后,鼠标悬停在任意柱子上,就能准确显示该柱子所属分组的最大值啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:06:21