使用 Matplotlib 构建直方图

PythonPythonBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何使用Matplotlib通过矩形和PolyCollections来构建直方图。我们将使用numpy生成随机数据,然后使用Matplotlib将数据可视化为直方图。本实验假设你对Python和Matplotlib有基本的了解。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们会及时为你解决问题。

导入必要的库

在开始之前,我们需要导入必要的库。在本实验中,我们将使用Matplotlib和numpy。打开一个新的Python文件,并添加以下代码:

import matplotlib.pyplot as plt
import numpy as np

设置随机种子并生成数据

我们将使用numpy生成随机数据。为了使我们的结果具有可重复性,我们将设置一个随机种子。在你的文件中添加以下代码:

np.random.seed(19680801)
data = np.random.randn(1000)

生成直方图数据

既然我们已经有了随机数据,就可以使用numpy生成直方图了。我们将使用50个 bins 来创建直方图。添加以下代码:

n, bins = np.histogram(data, 50)

生成矩形的角点

为了使用矩形绘制我们的直方图,我们需要计算每个矩形的角点。添加以下代码:

left = bins[:-1]
right = bins[1:]
bottom = np.zeros(len(left))
top = bottom + n

生成路径对象并从中创建一个补丁

接下来,我们将生成一个路径对象并从中创建一个补丁。我们将使用该路径对象通过矩形来绘制我们的直方图。添加以下代码:

XY = np.array([[left, left, right, right], [bottom, top, top, bottom]]).T
barpath = path.Path.make_compound_path_from_polys(XY)
patch = patches.PathPatch(barpath)
patch.sticky_edges.y[:] = [0]
axs[0].add_patch(patch)
axs[0].autoscale_view()

使用路径集合绘制直方图

我们可以使用一种更快的方法,即通过路径集合(PathCollection)来绘制直方图,而不是使用大量的矩形实例。我们将直接使用顶点和代码创建一个复合路径。添加以下代码:

nrects = len(left)
nverts = nrects*(1+3+1)
verts = np.zeros((nverts, 2))
codes = np.ones(nverts, int) * path.Path.LINETO
codes[0::5] = path.Path.MOVETO
codes[4::5] = path.Path.CLOSEPOLY
verts[0::5, 0] = left
verts[0::5, 1] = bottom
verts[1::5, 0] = left
verts[1::5, 1] = top
verts[2::5, 0] = right
verts[2::5, 1] = top
verts[3::5, 0] = right
verts[3::5, 1] = bottom

barpath = path.Path(verts, codes)
patch = patches.PathPatch(barpath)
patch.sticky_edges.y[:] = [0]
axs[1].add_patch(patch)
axs[1].autoscale_view()

显示直方图

最后,我们可以使用Matplotlib显示我们的直方图。将以下代码添加到你的文件中:

plt.show()

总结

在本实验中,我们学习了如何使用Matplotlib通过矩形和多边形集合(PolyCollections)来构建直方图。我们使用numpy生成随机数据,然后使用Matplotlib将数据可视化为直方图。我们还学习了如何使用路径集合(PathCollection)绘制直方图,这是一种比使用大量矩形实例更快的方法。