简介
本教程演示如何使用 Matplotlib 绘制样本的经验累积分布函数(ECDF)和理论累积分布函数。在工程领域,ECDF 也被称为“不超过”曲线,其中给定 x 值的 y 值表示样本观测值低于该 x 值的概率。相反,经验互补累积分布函数(ECCDF,或“超过”曲线)显示样本观测值高于值 x 的概率 y。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
导入必要的库
在这一步中,我们将导入必要的库。在本教程中,我们将使用 NumPy 和 Matplotlib 库。
import matplotlib.pyplot as plt
import numpy as np
设置随机种子并生成数据
在这一步中,我们将设置随机种子并生成数据。我们将从均值为 200、标准差为 25 的正态分布中生成 100 个数据点。
np.random.seed(19680801)
mu = 200
sigma = 25
data = np.random.normal(mu, sigma, size=100)
创建图形和子图
在这一步中,我们将创建一个带有两个用于累积分布的子图的图形。我们还将把图形大小设置为 9x4。
fig = plt.figure(figsize=(9, 4), layout="constrained")
axs = fig.subplots(1, 2, sharex=True, sharey=True)
绘制累积分布
在这一步中,我们将绘制累积分布。我们将使用.ecdf方法来绘制经验累积分布函数(ECDF)和互补经验累积分布函数。我们还将使用均值为 200、标准差为 25 的正态分布来绘制理论累积分布函数。
## 累积分布
axs[0].ecdf(data, label="CDF")
n, bins, patches = axs[0].hist(data, 25, density=True, histtype="step",
cumulative=True, label="累积直方图")
x = np.linspace(data.min(), data.max())
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) *
np.exp(-0.5 * (1 / sigma * (x - mu))**2))
y = y.cumsum()
y /= y[-1]
axs[0].plot(x, y, "k--", linewidth=1.5, label="理论")
## 互补累积分布
axs[1].ecdf(data, complementary=True, label="CCDF")
axs[1].hist(data, bins=bins, density=True, histtype="step", cumulative=-1,
label="反向累积直方图")
axs[1].plot(x, 1 - y, "k--", linewidth=1.5, label="理论")
为图形添加标签
在这一步中,我们将为图形添加标签。我们会添加一个标题、网格线以及 x 轴和 y 轴的标签。
fig.suptitle("累积分布")
for ax in axs:
ax.grid(True)
ax.legend()
ax.set_xlabel("年降雨量 (毫米)")
ax.set_ylabel("发生概率")
ax.label_outer()
plt.show()
总结
在本教程中,我们学习了如何使用 Matplotlib 绘制经验累积分布函数(ECDF)和理论累积分布函数。我们还学习了如何绘制经验互补累积分布函数(ECCDF)和反向累积直方图。通过遵循本教程中概述的步骤,你现在应该能够使用 Matplotlib 创建自己的累积分布图。