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)
关键改动说明
- 修正count类型:把字符串改成整数,保证Bokeh能正确识别数值位置,避免y轴坐标计算异常。
- 统一数据源:条形图和标签都用同一个
source(基于处理后的dfn),彻底解决数据源不匹配的问题。 - 构造正确的x因子:手动生成
lvl_feature组合字段,作为x轴的范围,让条形图和标签的x位置完全对应。 - 调整vbar参数:把
top="count_top"改成top="count"(你的原始数据里没有count_top字段),同时把宽度设为0.8让条形更美观。
这样修改后,数值标签就能正确显示在每个条形的上方啦~
内容的提问来源于stack exchange,提问作者BioFrank
相关产品推荐
相关产品推荐

