如何使同平面内两个样本直方图层叠且清晰可见?
问题描述
我有如下样本数据:
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
相关产品推荐
相关产品推荐

