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

如何使同平面内两个样本直方图层叠且清晰可见?

问题描述

我有如下样本数据:

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

population_men  = stats.norm.rvs(loc=19, scale=171, size=11000000)  # 男性身高样本,平均身高171
population_women = stats.norm.rvs(loc=16, scale=165, size=12000)  # 女性身高样本,平均身高165

t, p = stats.ttest_ind(population_men, population_women)
print(t, p)
# 输出结果: (-0.1213798367777649, 0.9033901889229905)

随后执行以下代码绘制直方图:

plt.hist(population_men, bins=25, color = 'purple'); # 男性样本
plt.hist(population_women, bins=25, color = 'blue');  # 女性样本

生成的图表无法清晰呈现两个样本的层叠效果,请求指导如何调整实现两个样本图层叠且均可见。

调整方案

核心问题是两组样本量差距极大(男性1100万 vs 女性1.2万),默认直方图的频率绘制模式会让小样本的柱子被完全覆盖。以下是几种可行的调整方式:

  • 添加透明度并标注图例
    通过alpha参数设置透明度(0~1,值越小越透明),让两组直方图互相可见,同时添加图例区分:

    plt.hist(population_men, bins=25, color='purple', alpha=0.5, label='男性');
    plt.hist(population_women, bins=25, color='blue', alpha=0.5, label='女性');
    plt.legend()  # 显示图例
    plt.show()
    
  • 改用密度模式绘制
    由于样本量差异悬殊,用概率密度(density=True)替代默认的频率计数,能更公平地展示两组的分布形态。同时建议统一两组的bins区间,确保对比的一致性:

    # 基于合并数据计算统一的bins区间
    combined_data = np.concatenate([population_men, population_women])
    bins = np.histogram_bin_edges(combined_data, bins=25)
    
    plt.hist(population_men, bins=bins, color='purple', alpha=0.5, density=True, label='男性');
    plt.hist(population_women, bins=bins, color='blue', alpha=0.5, density=True, label='女性');
    plt.legend()
    plt.xlabel('身高')
    plt.ylabel('概率密度')
    plt.show()
    
  • 缩小大样本量(可选)
    如果不需要全量男性数据,可随机抽取与女性样本量相近的子集,从根源上消除样本量差距带来的展示问题:

    # 随机抽取12000个男性样本
    sampled_men = np.random.choice(population_men, size=12000, replace=False)
    plt.hist(sampled_men, bins=25, color='purple', alpha=0.5, label='男性');
    plt.hist(population_women, bins=25, color='blue', alpha=0.5, label='女性');
    plt.legend()
    plt.show()
    
  • 使用堆叠直方图
    若想展示两组叠加后的整体分布,同时保留各自的占比,可设置stacked=True:

    plt.hist([population_men, population_women], bins=25, color=['purple', 'blue'], stacked=True, label=['男性', '女性']);
    plt.legend()
    plt.show()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:20:35