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

如何制作按分类变量堆叠的数值列直方图?

解决堆叠式分类直方图/条形图的两种方法

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:15:37