一、案例背景
本案例通过生成5种不同分布(正态、对数正态、指数、Gumbel、三角分布)的随机数据,并使用Bootstrap重采样方法生成新数据集。通过箱线图对比原始数据与重采样数据的分布差异,学习Matplotlib高级绘图技巧。
二、代码解析
1. 数据生成
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
random_dists = ['Normal(1, 1)', 'Lognormal(1, 1)', 'Exp(1)', 'Gumbel(6, 4)', 'Triangular(2, 9, 11)']
N = 500 # 样本量
# 生成原始数据
norm = np.random.normal(1, 1, N)
logn = np.random.lognormal(1, 1, N)
expo = np.random.exponential(1, N)
gumb = np.random.gumbel(6, 4, N)
tria = np.random.triangular(2, 9, 11, N)
# Bootstrap重采样(使用相同索引)
bootstrap_indices = np.random.randint(0, N, N)
data = [
norm, norm[bootstrap_indices],
logn, logn[bootstrap_indices],
expo, expo[bootstrap_indices],
gumb, gumb[bootstrap_indices],
tria, tria[bootstrap_indices],
]
- Bootstrap原理:通过对原始数据有放回地随机抽样生成新数据集,用于评估统计量的稳定性。
- 每个分布生成
500个样本,重采样使用相同索引保证代码简洁。
2. 箱线图绘制
fig, ax1 = plt.subplots(figsize=(10,6))
bp = ax1.boxplot(data, notch=False, sym='+', vert=True, whis=1.5)
# 样式设置
plt.setp(bp['boxes'], color='black') # 箱体边框
plt.setp(bp['whiskers'], color='black') # 须线
plt.setp(bp['fliers'], color='red', marker='+') # 离群值
ax1.yaxis.grid(True, color='lightgrey', alpha=0.5) # 水平网格
ax1.set(title='Distribution Comparison', xlabel='Distribution', ylabel='Value')
- 参数说明:
whis=1.5:须线范围为1.5倍IQR(四分位距)。sym='+':离群点标记为红色+号。
3. 高级美化技巧
3.1 交替填充颜色
box_colors = ['darkkhaki', 'royalblue']
for i in range(len(data)):
box_coords = np.column_stack([bp['boxes'][i].get_xdata(), bp['boxes'][i].get_ydata()])
ax1.add_patch(Polygon(box_coords, facecolor=box_colors[i%2])) # 交替颜色
- 通过
i%2实现原始数据与重采样数据颜色交替(黄褐色 vs 宝蓝)。
3.2 标记中位数与均值
medians = [np.median(dataset) for dataset in data]
for i, med_line in enumerate(bp['medians']):
ax1.plot(*med_line.get_xydata().T, color='black') # 中位线
ax1.plot(np.mean(med_line.get_xdata()), np.mean(data[i]),
color='w', marker='*', markeredgecolor='k') # 均值星号
4. 坐标轴与图例优化
# X轴标签旋转45度
ax1.set_xticklabels(np.repeat(random_dists, 2), rotation=45, fontsize=8)
# 顶部添加中位数标签
for tick in range(len(data)):
ax1.text(tick+1, 0.95, f'{medians[tick]:.2f}', transform=ax1.get_xaxis_transform(),
color=box_colors[tick%2], weight='bold', ha='center', size=8)
# 自定义图例
fig.text(0.8, 0.08, 'Original Data', color='black', backgroundcolor=box_colors[0])
fig.text(0.8, 0.05, 'Bootstrap Sample', color='white', backgroundcolor=box_colors[1])
fig.text(0.8, 0.02, '*: Mean', color='black')
三、关键输出结果

分析结论:
- 重采样数据的分布范围与原数据基本一致。
- 均值(星号)与中位数(顶部标签)位置反映分布偏态(如指数分布右偏)。
- 三角分布因范围限制,箱线图呈现紧凑形态。
四、核心知识点
-
箱线图组成:
- 箱体:Q1~Q3
- 中位线:箱体内横线
- 须线:1.5*IQR范围内的数据
- 离群值:须线外的数据点
-
Bootstrap应用场景:
- 小样本统计量估计
- 模型稳定性评估
-
Matplotlib高级操作:
- 通过
Patch对象自定义图形 - 坐标轴变换(
get_xaxis_transform()) - 文本标注与图例排版
- 通过
五、优化建议
- 可对Bootstrap结果进行多轮采样,绘制误差线。
- 添加统计学检验(如KS检验)量化差异。
- 使用
seaborn库简化部分样式代码。
2901

被折叠的 条评论
为什么被折叠?



