如何用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
相关产品推荐
相关产品推荐

