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

如何用Python绘制按分类变量(性别)叠加的年龄直方图?

按分类变量叠加直方图的实现方法

嘿,刚好做过类似的可视化需求,来给你一步步讲清楚怎么实现~

核心思路

叠加直方图的本质是把不同分类下的数值变量(比如这里的年龄)分布画在同一坐标轴上,通过透明度调整和差异化颜色来区分不同组,这样能直观对比各组的分布差异(比如峰值位置、离散程度等)。

Python代码实现(按性别分类的年龄直方图)

下面我给你两种常用的实现方式,分别用Matplotlib+Pandas和Seaborn,你可以根据自己的习惯选择:

方法一:Matplotlib + Pandas 手动实现

这种方式灵活性更高,适合自定义细节:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 先构造一份示例数据(你可以替换成自己的真实数据)
np.random.seed(42)  # 固定随机种子,保证结果可复现
data = pd.DataFrame({
    '性别': np.random.choice(['男', '女'], size=1000),
    '年龄': np.where(
        np.random.choice([True, False], size=1000),
        np.random.normal(loc=30, scale=5, size=1000),  # 男性年龄均值30,标准差5
        np.random.normal(loc=28, scale=4, size=1000)   # 女性年龄均值28,标准差4
    )
})

# 按性别拆分年龄数据
male_ages = data[data['性别'] == '男']['年龄']
female_ages = data[data['性别'] == '女']['年龄']

# 创建画布
plt.figure(figsize=(10, 6))

# 绘制叠加直方图:关键是设置alpha(透明度)让两组都可见
plt.hist(male_ages, bins=15, alpha=0.6, label='男', color='#1f77b4')
plt.hist(female_ages, bins=15, alpha=0.6, label='女', color='#ff7f0e')

# 添加图表细节
plt.title('不同性别群体的年龄分布叠加直方图', fontsize=14)
plt.xlabel('年龄', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.legend(fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)  # 只给y轴加网格,更清晰

plt.show()

方法二:Seaborn 快速实现

Seaborn是Matplotlib的高级封装,代码更简洁,适合快速生成统计图表:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 同样用示例数据(替换成你的真实数据即可)
np.random.seed(42)
data = pd.DataFrame({
    '性别': np.random.choice(['男', '女'], size=1000),
    '年龄': np.where(
        np.random.choice([True, False], size=1000),
        np.random.normal(loc=30, scale=5, size=1000),
        np.random.normal(loc=28, scale=4, size=1000)
    )
})

# 创建画布
plt.figure(figsize=(10, 6))

# 一行代码搞定叠加直方图:hue指定分类变量,multiple='layer'表示叠加模式
sns.histplot(
    data=data,
    x='年龄',
    hue='性别',
    bins=15,
    alpha=0.6,
    multiple='layer',  # 可选'stack'(堆叠)或'dodge'(并列),按需调整
    palette=['#1f77b4', '#ff7f0e']
)

# 添加图表细节
plt.title('不同性别群体的年龄分布叠加直方图', fontsize=14)
plt.xlabel('年龄', fontsize=12)
plt.ylabel('人数', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)

plt.show()

注意事项

  • 确保不同分类的bins(直方图区间数)一致,这样对比才有意义
  • 调整alpha(透明度)到0.5-0.7之间,既能区分两组,又不会完全遮挡
  • 选择对比度高的颜色,避免相近颜色导致混淆
  • 如果各组数据量差异极大,可以在绘制时加上density=True,用密度代替频数,更公平地对比分布形态

内容的提问来源于stack exchange,提问作者Hattori

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:07:37