如何指定pandas直方图坐标轴 按列分组统计Count绘制4个分布直方图
问题原因
df.hist() 方法的作用是绘制单列数值的频率分布直方图,默认统计每个数值在该列中的出现频次,不支持直接指定分组维度与聚合计算逻辑。你传入的Col_A、Col_B等都是分类文本列,pandas无法直接对文本列绘制数值分布,因此最终只会返回唯一的数值列Count的分布结果。
另外你要实现的是分类维度对应Count求和值的对比,本质是分类柱状图,和统计频率的直方图逻辑不同,用柱状图更贴合需求。
实现代码
首先导入依赖库:
import pandas as pd import matplotlib.pyplot as plt
示例数据构造(你可以跳过这步直接用自己的df2):
data = { 'Col_A': ['Apples', 'Oranges', 'Pears'], 'Col_B': ['England', 'Scotland', 'Wales'], 'Col_C': ['Red', 'Orange', 'Green'], 'Count': [10, 20, 30] } df2 = pd.DataFrame(data)
绘图逻辑:
# 创建2行2列的画布承载4个图 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12, 8)) # 1. Col_A唯一值对应Count求和结果 df2.groupby('Col_A')['Count'].sum().plot( kind='bar', ax=axes[0,0], title='Col_A维度Count总和', xlabel='Col_A取值', ylabel='Count求和结果' ) # 2. Col_B唯一值对应Count求和结果 df2.groupby('Col_B')['Count'].sum().plot( kind='bar', ax=axes[0,1], title='Col_B维度Count总和', xlabel='Col_B取值', ylabel='Count求和结果' ) # 3. Col_C唯一值对应Count求和结果 df2.groupby('Col_C')['Count'].sum().plot( kind='bar', ax=axes[1,0], title='Col_C维度Count总和', xlabel='Col_C取值', ylabel='Count求和结果' ) # 4. Col_A+Col_B+Col_C组合对应Count求和结果 df2.groupby(['Col_A', 'Col_B', 'Col_C'])['Count'].sum().plot( kind='bar', ax=axes[1,1], title='三列组合维度Count总和', xlabel='三列取值组合', ylabel='Count求和结果' ) # 调整布局避免标签重叠 plt.tight_layout() plt.show()
补充说明
如果确实需要绘制求和后Count值的频率直方图,只需要把plot(kind='bar')替换为hist()即可,此时X轴为Count的数值区间,Y轴为落在该区间的维度数量,示例:
df2.groupby('Col_A')['Count'].sum().hist(ax=axes[0,0])
内容的提问来源于stack exchange,提问作者Tobias Funke
相关产品推荐
相关产品推荐

