如何制作按分类变量堆叠的数值列直方图?
解决堆叠式分类直方图/条形图的两种方法
方法1:将现有分组条形图改为堆叠式
你的代码生成并列条形图是因为groupby('binned_age')['job'].value_counts()返回的是长格式数据,需要先转成宽格式(将job类别转为列),再指定stacked=True即可实现堆叠,同时自动添加颜色区分:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 生成示例数据 df = pd.DataFrame({'age': np.random.normal(45, 5, 100), 'job': np.random.choice(['engineer', 'barista', 'quantity surveyor'], size=100)}) # 分箱并转成宽格式 df['binned_age'] = pd.qcut(df.age, 5) counts = df.groupby('binned_age')['job'].value_counts().unstack(fill_value=0) # 绘制堆叠条形图 counts.plot(kind='bar', stacked=True) plt.xlabel('年龄分箱') plt.ylabel('人数') plt.title('按职业堆叠的年龄分箱人数') plt.legend(title='职业') plt.show()
方法2:直接绘制堆叠式直方图(无需提前分箱)
如果想直接生成原生堆叠直方图(不是先分箱的条形图),可以按分类变量拆分数值数据,再传入plt.hist并设置stacked=True:
# 按职业拆分年龄数据 age_groups = [df[df['job'] == job]['age'] for job in df['job'].unique()] # 绘制堆叠直方图 plt.hist(age_groups, bins=5, stacked=True, label=df['job'].unique()) plt.xlabel('年龄') plt.ylabel('人数') plt.title('按职业堆叠的年龄直方图') plt.legend(title='职业') plt.show()
关键说明
- 方法1适合需要自定义分箱规则(比如qcut分位数分箱)的场景,输出的是离散分箱的堆叠条形图;
- 方法2是matplotlib原生的堆叠直方图,自动按指定bins分箱,更贴近常规直方图的形态。
内容的提问来源于stack exchange,提问作者Josh Friedlander
相关产品推荐
相关产品推荐

