如何基于Pandas DataFrame按某列分组结果绘制另一列的堆叠直方图
解决方法
你使用pd.hist(by='Column A', column='Column B', stacked=True)无法得到预期效果的原因是:by参数的作用是将数据集按指定列的唯一值拆分,为每个分组单独生成子图,和你需要的「同一画布内按分组堆叠展示直方图」的需求不符。
可行实现方案
两种常用实现方法如下,可根据自定义需求选择:
首先导入依赖:
import pandas as pd import matplotlib.pyplot as plt
方法1:转宽表后用pandas内置绘图接口
先把数据按Column A分组,转换为每列对应一个分组的宽格式,直接调用绘图接口即可:
# 示例数据,替换为你的实际数据即可 df = pd.DataFrame({ 'Column A': ['Foo', 'Bar', 'Baz', 'Foo', 'Bar', 'Baz', 'Foo', 'Bar', 'Baz'], 'Column B': [5, 46, 100, 10, 52, 87, 17, 39, 92] }) # 转为宽格式:每列对应Column A的一个分组,值为对应Column B的数值 df_wide = df.pivot(columns='Column A', values='Column B') # 绘制堆叠直方图,bins参数可调整数值分箱数量 df_wide.plot.hist(stacked=True, edgecolor='white', bins=10) # 可选:自定义图表样式 plt.xlabel('Column B 数值') plt.ylabel('频数') plt.title('按Column A分组堆叠直方图') plt.legend(title='Column A') plt.show()
方法2:直接用matplotlib手动拆分分组绘制
如果需要更灵活的样式配置,可手动拆分分组数据后传给matplotlib的hist接口:
# 按Column A拆分Column B的数值 grouped = df.groupby('Column A')['Column B'] group_values = [g.values for _, g in grouped] group_labels = [name for name, _ in grouped] # 绘制堆叠直方图 plt.hist(group_values, stacked=True, label=group_labels, edgecolor='white', bins=10) # 自定义样式 plt.xlabel('Column B 数值') plt.ylabel('频数') plt.title('按Column A分组堆叠直方图') plt.legend(title='Column A') plt.show()
内容的提问来源于stack exchange,提问作者EDG956
相关产品推荐
相关产品推荐

