使用 Matplotlib 生成多个直方图

Beginner

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

简介

直方图是可视化数据集分布的好方法,而 Matplotlib 是创建数据可视化最流行的 Python 库之一。在本实验中,我们将使用 Matplotlib 为多个数据集创建并排直方图。

虚拟机使用提示

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

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

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

导入必要的库

首先,我们需要为代码导入必要的库。我们将使用 Matplotlib 和 NumPy 来绘制直方图:

import matplotlib.pyplot as plt
import numpy as np

创建示例数据集

接下来,我们将创建用于直方图的示例数据集。我们将创建三个数据集,每个数据集包含 387 个数据点:

np.random.seed(19680801)
number_of_data_points = 387
labels = ["A", "B", "C"]
data_sets = [np.random.normal(0, 1, number_of_data_points),
             np.random.normal(6, 1, number_of_data_points),
             np.random.normal(-3, 1, number_of_data_points)]

计算绘图所需的量

在创建直方图之前,我们需要计算一些用于绘图的量。我们将计算数据集的范围、装箱后的数据集、每个箱子的最大值以及每个直方图的 x 轴位置:

hist_range = (np.min(data_sets), np.max(data_sets))
number_of_bins = 20
binned_data_sets = [
    np.histogram(d, range=hist_range, bins=number_of_bins)[0]
    for d in data_sets
]
binned_maximums = np.max(binned_data_sets, axis=1)
x_locations = np.arange(0, sum(binned_maximums), np.max(binned_maximums))

绘制直方图

既然我们已经计算出了绘图所需的量,就可以创建直方图了。我们将使用barh方法为每个直方图绘制水平条:

## 所有直方图的箱边缘是相同的
bin_edges = np.linspace(hist_range[0], hist_range[1], number_of_bins + 1)
heights = np.diff(bin_edges)
centers = bin_edges[:-1] + heights / 2

## 循环并绘制每个直方图
fig, ax = plt.subplots()
for x_loc, binned_data in zip(x_locations, binned_data_sets):
    lefts = x_loc - 0.5 * binned_data
    ax.barh(centers, binned_data, height=heights, left=lefts)

ax.set_xticks(x_locations, labels)
ax.set_ylabel("数据值")
ax.set_xlabel("数据集")

显示直方图

最后,我们可以使用show方法来显示直方图:

plt.show()

总结

在这个实验中,我们学习了如何使用 Matplotlib 为多个数据集创建并排直方图。我们计算了绘图所需的量,并使用barh方法为每个直方图创建水平条。有了这些技能,我们可以创建信息丰富的数据可视化,以获得见解并与他人交流我们的发现。