如何基于Pandas groupby结果绘制同图多色分组柱状图?
问题:Pandas分组柱状图无法按origin区分颜色并在同一图表展示
DataFrame结构(已将日期列解析为datetime并设为索引):
origin delta month 2021-09 admin -1000 2021-09 ext 20 2021-10 ext 648 2021-11 admin -1000 2021-11 ext 590
(注:实际数据为32行3列)
尝试的代码及问题:
- 使用
groupby绘图:
monthframe.groupby("origin").plot(kind="bar",stacked=True, legend=True, xlabel="Month", ylabel="Delta", layout=(20,10),subplots=False)
无法在同一图表中显示不同颜色的分组柱状图。
- 直接调用
plot:
monthframe.plot(kind="bar",stacked=True, legend=True, xlabel="Month", ylabel="Delta", layout=(20,10),subplots=False)
生成单个图表但所有origin的柱形都合并到同一月份且为同一种蓝色,无法区分分组信息,且部分参数不被识别。
解决方案:
核心是先将数据重塑为宽格式,让每个origin成为单独的列,这样Pandas就能自动为不同列分配不同颜色并在同一月份下展示分组柱形。
步骤1:重塑数据(用pivot)
# 将数据转为宽格式,month为索引,origin为列,delta为值 pivoted_df = monthframe.pivot(index='month', columns='origin', values='delta')
处理后的数据结构会变成:
origin admin ext month 2021-09 -1000 20 2021-10 NaN 648 2021-11 -1000 590
(若存在NaN,可使用fillna(0)填充,避免柱形缺失)
步骤2:绘制分组/堆叠柱状图
- 分组柱状图(并列显示):
pivoted_df.plot(kind='bar', xlabel='Month', ylabel='Delta', legend=True)
- 堆叠柱状图:
pivoted_df.fillna(0).plot(kind='bar', stacked=True, xlabel='Month', ylabel='Delta', legend=True)
问题原因说明:
- 直接调用
plot时,Pandas默认把每行作为独立柱形,未按origin分组区分; groupby.plot默认会为每个分组生成单独子图,即使设置subplots=False也无法正确合并,因为原始长格式数据不符合并列/堆叠的结构要求。
内容的提问来源于stack exchange,提问作者Ando Jurai
相关产品推荐
相关产品推荐

