Bokeh分组柱状图数据展示调整:实现分组计数与求和的疑问
解决Bokeh分组柱状图展示计数/求和的问题
你遇到的问题核心在于,原代码里的group只是Pandas的分组对象,Bokeh在使用它作为数据源时,默认对数值列(比如mpg)计算了均值并生成mpg_mean列,但并没有自动生成计数或求和对应的列。要实现展示分组计数或求和,你需要显式对分组对象做聚合操作,生成对应的列后再传入Bokeh。
下面是两种场景的完整修改代码:
场景1:展示每组的行数计数
我们需要用agg()方法对mpg列(或者任意列,因为计数是统计行数)执行count操作,命名为mpg_count,同时构造用于x轴的组合标签:
from bokeh.io import output_file, show from bokeh.palettes import Spectral5 from bokeh.plotting import figure from bokeh.sampledata.autompg import autompg_clean as df from bokeh.transform import factor_cmap output_file("bar_pandas_groupby_count.html") df.cyl = df.cyl.astype(str) df.yr = df.yr.astype(str) # 显式聚合:按cyl和mfr分组,统计每组行数(用mpg列计数即可) group = df.groupby(by=['cyl', 'mfr']).agg(mpg_count=('mpg', 'count')).reset_index() # 构造x轴的组合标签:cyl + mfr group['cyl_mfr'] = group['cyl'] + ', ' + group['mfr'] index_cmap = factor_cmap('cyl_mfr', palette=Spectral5, factors=sorted(df.cyl.unique()), end=1) p = figure(width=800, height=300, title="Row Count by # cylinders and manufacturer", x_range=group['cyl_mfr'], toolbar_location=None, tooltips=[("Count", "@mpg_count"), ("Cyl, Mfr", "@cyl_mfr")]) p.vbar(x='cyl_mfr', top='mpg_count', width=1, source=group, line_color="white", fill_color=index_cmap) p.y_range.start = 0 p.x_range.range_padding = 0.05 p.xgrid.grid_line_color = None p.xaxis.axis_label = "Manufacturer grouped by # Cylinders" p.xaxis.major_label_orientation = 1.2 p.outline_line_color = None show(p)
场景2:展示每组的mpg求和
类似地,把聚合操作改成sum即可:
from bokeh.io import output_file, show from bokeh.palettes import Spectral5 from bokeh.plotting import figure from bokeh.sampledata.autompg import autompg_clean as df from bokeh.transform import factor_cmap output_file("bar_pandas_groupby_sum.html") df.cyl = df.cyl.astype(str) df.yr = df.yr.astype(str) # 显式聚合:按cyl和mfr分组,计算mpg的求和 group = df.groupby(by=['cyl', 'mfr']).agg(mpg_sum=('mpg', 'sum')).reset_index() group['cyl_mfr'] = group['cyl'] + ', ' + group['mfr'] index_cmap = factor_cmap('cyl_mfr', palette=Spectral5, factors=sorted(df.cyl.unique()), end=1) p = figure(width=800, height=300, title="Sum of MPG by # cylinders and manufacturer", x_range=group['cyl_mfr'], toolbar_location=None, tooltips=[("Total MPG", "@mpg_sum"), ("Cyl, Mfr", "@cyl_mfr")]) p.vbar(x='cyl_mfr', top='mpg_sum', width=1, source=group, line_color="white", fill_color=index_cmap) p.y_range.start = 0 p.x_range.range_padding = 0.05 p.xgrid.grid_line_color = None p.xaxis.axis_label = "Manufacturer grouped by # Cylinders" p.xaxis.major_label_orientation = 1.2 p.outline_line_color = None show(p)
关键修改点说明:
- 用
groupby(...).agg(新列名=(原列名, 聚合函数))显式生成需要的统计列,比如mpg_count或mpg_sum - 调用
reset_index()把分组索引转为普通列,方便构造x轴的组合标签 - 手动创建
cyl_mfr列,作为x轴的显示标签,同时匹配factor_cmap的映射逻辑 - 同步修改图表标题、tooltips内容、
vbar的top参数,确保和新的列名对应
内容的提问来源于stack exchange,提问作者BikeControl
相关产品推荐
相关产品推荐

