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

如何用Pandas绘制一维分组、一维堆叠的混合柱状图?

没问题!我来帮你实现这个需求——按第一个分类变量分组求和,同时在每个分组里用第二个分类变量堆叠显示5个数值列的柱状图。下面是完整的代码和步骤说明:

1. 完整构建示例DataFrame

先补全你给出的DataFrame代码,加入5个随机数值列,确保代码可直接运行:

import pandas as pd
import random
import matplotlib.pyplot as plt

l = 100
df = pd.DataFrame({
    'op1': [random.randint(0, 1) for x in range(l)],
    'op2': [random.randint(0, 1) for x in range(l)],
    'num1': [random.randint(10, 50) for x in range(l)],
    'num2': [random.randint(10, 50) for x in range(l)],
    'num3': [random.randint(10, 50) for x in range(l)],
    'num4': [random.randint(10, 50) for x in range(l)],
    'num5': [random.randint(10, 50) for x in range(l)]
})
2. 数据聚合处理

我们需要先按op1和op2分组,对5个数值列求和,再将op2转换为列结构,这样绘图时能自动实现堆叠效果:

# 按两个分类变量分组,对数值列求和
agg_df = df.groupby(['op1', 'op2'])[['num1', 'num2', 'num3', 'num4', 'num5']].sum()
# 将op2从索引转为列,方便堆叠绘图
stacked_data = agg_df.unstack(level='op2')
3. 绘制堆叠分组柱状图

使用Pandas的plot.bar()方法,设置stacked=True开启堆叠模式,再添加一些美化让图表更清晰:

# 绘制堆叠柱状图
ax = stacked_data.plot(kind='bar', stacked=True, figsize=(12, 8), colormap='viridis')

# 添加标题和坐标轴标签
ax.set_title('Sum of Numeric Columns Grouped by op1, Stacked by op2', fontsize=14)
ax.set_xlabel('op1 Category', fontsize=12)
ax.set_ylabel('Total Value', fontsize=12)

# 调整图例位置,避免遮挡图表
ax.legend(title='op2 Category', bbox_to_anchor=(1.05, 1), loc='upper left')

# 添加网格线并优化布局
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
关键逻辑说明
  • groupby(['op1', 'op2']):同时按两个分类变量分组,保证每个op1分类下的op2子类别都被单独计算求和。
  • unstack(level='op2'):将op2从行索引转换为列,这样Pandas绘图时会自动把同一op1下的不同op2值作为堆叠层。
  • stacked=True:开启堆叠模式,每个分组的柱状图会把op2的不同类别堆叠在一起,直观展示各子类别的贡献占比。

运行后你会得到清晰的图表:X轴是op1的0和1两个分类,每个分类下对应5个柱子(对应5个数值列),每个柱子又按op2的0和1堆叠显示各自的求和值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:03:05