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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:07:33