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

Python Bokeh分组条形图标签不显示,如何添加数值标签?

解决Bokeh条形图添加数值标签不显示的问题

我看了你的代码,确实是数据源匹配和数据类型的问题导致标签显示不出来,咱们一步步来修正:

几个核心问题分析

  • 数据源不统一:你画条形图用的是groupn(groupby后的对象),但标签用的是sourceframe(原始DataFrame的数据源),两者的x轴字段不一致(vbar用lvl_feature,标签用feature),导致标签找不到正确的位置。
  • count字段类型错误:你定义的count是字符串列表(["5", "20"...]),Bokeh处理数值坐标时需要数值类型,字符串会导致y轴位置计算异常。
  • groupby使用不当:其实你的数据已经是每个lvl+feature对应一个count,不需要额外groupby,直接构造x轴的因子组合即可。

修正后的完整代码

from bokeh.io import export_png, output_file, show
from bokeh.palettes import Spectral5
from bokeh.plotting import figure
from bokeh.transform import factor_cmap
from bokeh.models import ColumnDataSource, LabelSet
import pandas as pd

# 1. 修正count的数据类型为整数
d = {'lvl': ["lvl1", "lvl2", "lvl2", "lvl3"], 
     'feature': ["test1", "test2","test3","test4"], 
     'count': [5, 20, 8, 90]}  # 这里改成整数类型
dfn = pd.DataFrame(data=d)

# 2. 构造x轴需要的lvl+feature组合因子
dfn['lvl_feature'] = dfn.apply(lambda row: (row['lvl'], row['feature']), axis=1)
source = ColumnDataSource(data=dfn)

# 3. 定义x轴范围为构造好的因子
x_factors = dfn['lvl_feature'].tolist()
pn = figure(plot_width=800, plot_height=300, title="Count",
            x_range=x_factors, toolbar_location=None)

# 4. 绘制条形图,用统一的数据源
index_cmapn = factor_cmap('lvl_feature', palette=Spectral5, 
                          factors=sorted(dfn.lvl.unique()), end=1)
pn.vbar(x='lvl_feature', top="count", width=0.8, source=source,
        line_color="white", fill_color=index_cmapn)

# 5. 添加标签,确保x、y字段和数据源一致
labels = LabelSet(x='lvl_feature', y='count', text='count', 
                  level='glyph', x_offset=0, y_offset=5, 
                  source=source, render_mode='canvas')
pn.add_layout(labels)

# 其他样式设置
pn.y_range.start = 0
pn.x_range.range_padding = 0.05
pn.xgrid.grid_line_color = None
pn.xaxis.axis_label = "levels"
pn.xaxis.major_label_orientation = 1.2
pn.outline_line_color = None

# 导出或显示图表
export_png(pn, filename="color.png")
# show(pn)

关键改动说明

  1. 修正count类型:把字符串改成整数,保证Bokeh能正确识别数值位置,避免y轴坐标计算异常。
  2. 统一数据源:条形图和标签都用同一个source(基于处理后的dfn),彻底解决数据源不匹配的问题。
  3. 构造正确的x因子:手动生成lvl_feature组合字段,作为x轴的范围,让条形图和标签的x位置完全对应。
  4. 调整vbar参数:把top="count_top"改成top="count"(你的原始数据里没有count_top字段),同时把宽度设为0.8让条形更美观。

这样修改后,数值标签就能正确显示在每个条形的上方啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:17:31