使用 Matplotlib 绘制经验累积分布

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程演示如何使用 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 创建自己的累积分布图。