使用 Matplotlib 绘制直方图

Beginner

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

简介

在本实验中,我们将学习如何使用 Matplotlib 绘制直方图。我们将生成数据并绘制一个简单的直方图、更新直方图颜色、绘制二维直方图以及自定义你的直方图。

虚拟机使用提示

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

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

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

生成数据并绘制简单直方图

要生成一维直方图,我们只需要一个数字向量。对于二维直方图,我们需要第二个向量。我们将在下面生成这两个向量,并展示每个向量的直方图。

import matplotlib.pyplot as plt
import numpy as np

## 创建一个具有固定种子的随机数生成器,以确保可重复性
rng = np.random.default_rng(19680801)

N_points = 100000
n_bins = 20

## 生成两个正态分布
dist1 = rng.standard_normal(N_points)
dist2 = 0.4 * rng.standard_normal(N_points) + 5

fig, axs = plt.subplots(1, 2, sharey=True, tight_layout=True)

## 我们可以使用 *bins* 关键字参数设置箱数。
axs[0].hist(dist1, bins=n_bins)
axs[1].hist(dist2, bins=n_bins)

plt.show()

更新直方图颜色

直方图方法返回(除其他外)一个“补丁”对象。这使我们能够访问所绘制对象的属性。利用这一点,我们可以根据自己的喜好编辑直方图。让我们根据每个柱子的 y 值来更改其颜色。

## N 是每个箱中的计数,bins 是箱的下限
N, bins, patches = axs[0].hist(dist1, bins=n_bins)

## 我们将根据高度进行颜色编码,但你可以使用任何标量
fracs = N / N.max()

## 我们需要将数据归一化到 0..1,以适应颜色映射的整个范围
norm = colors.Normalize(fracs.min(), fracs.max())

## 现在,我们将遍历我们的对象并相应地设置每个对象的颜色
for thisfrac, thispatch in zip(fracs, patches):
    color = plt.cm.viridis(norm(thisfrac))
    thispatch.set_facecolor(color)

## 我们也可以通过计数总数对输入进行归一化
axs[1].hist(dist1, bins=n_bins, density=True)

## 现在我们格式化 y 轴以显示百分比
axs[1].yaxis.set_major_formatter(PercentFormatter(xmax=1))

plt.show()

绘制二维直方图

要绘制二维直方图,只需要两个长度相同的向量,分别对应直方图的每个轴。

fig, ax = plt.subplots(tight_layout=True)
hist = ax.hist2d(dist1, dist2)

plt.show()

自定义你的直方图

自定义二维直方图与一维情况类似,你可以控制诸如箱大小或颜色归一化等视觉组件。

fig, axs = plt.subplots(3, 1, figsize=(5, 15), sharex=True, sharey=True,
                        tight_layout=True)

## 我们可以增加每个轴上的箱数
axs[0].hist2d(dist1, dist2, bins=40)

## 以及定义颜色的归一化
axs[1].hist2d(dist1, dist2, bins=40, norm=colors.LogNorm())

## 我们还可以为每个轴定义自定义的箱数
axs[2].hist2d(dist1, dist2, bins=(80, 10), norm=colors.LogNorm())

plt.show()

总结

在本实验中,我们学习了如何使用 Matplotlib 绘制直方图。我们生成了数据并绘制了简单的直方图,更新了直方图的颜色,绘制了二维直方图,并对直方图进行了定制。我们可以使用这些技术在各种场景下对数据进行可视化和分析。