matplotlib subplots
1. 简介
matplotlib
是一个用于绘制数据可视化图形的强大库,而subplots
则是 matplotlib
中的一个模块,用于在一个图像中创建多个子图。subplots
提供了一种简单的方式来管理并组织绘制多个子图,使得我们能够更清晰地展示和比较不同的数据。
本文将详细介绍 subplots
的基本概念、常用方法及其一些高级使用技巧,希望能够帮助读者更好地理解和使用 matplotlib subplots
。
2. subplots 初探
在使用 subplots
之前,我们首先需要了解 Figure
和 Axes
这两个概念。Figure
是整个图像的最外层容器,而 Axes
则是实际绘图区域。一个 Figure
可以包含一个或多个 Axes
。
接下来,我们通过一个简单的例子来演示 subplots
的基本使用。
首先,我们需要导入 matplotlib
并指定使用 inline
模式进行绘图,并导入 numpy
包以生成一些随机数据:
import matplotlib.pyplot as plt
import numpy as np
# 在 notebook 中显示图像
%matplotlib inline
# 生成随机数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
然后,我们可以使用 subplots
方法创建一个包含一个子图的 Figure
和 Axes
对象,并使用 plot
方法绘制数据:
fig, ax = plt.subplots()
ax.plot(x, y)
运行上述代码后,会显示出一个包含一条正弦曲线的子图。
3. 创建多个子图
现在,我们将演示如何在一个图像上创建多个子图。我们可以使用 subplots
的 nrows
和 ncols
参数来指定需要创建的子图的行数和列数。例如,下面的代码将创建一个包含 2 行 2 列的图像,并在每个子图上绘制随机数据:
# 生成随机数据
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x)
# 创建 2x2 的图像,并将其分割成 4 个子图
fig, axes = plt.subplots(nrows=2, ncols=2)
# 在每个子图上绘制数据
axes[0, 0].plot(x, y1)
axes[0, 0].set_title('Sin')
axes[0, 1].plot(x, y2)
axes[0, 1].set_title('Cos')
axes[1, 0].plot(x, y3)
axes[1, 0].set_title('Tan')
axes[1, 1].plot(x, y4)
axes[1, 1].set_title('Exp')
# 调整子图之间的距离
plt.tight_layout()
运行上述代码后,会显示一个包含 2 行 2 列的图像,每个子图上都绘制有不同的随机数据。
4. 改变图像的大小和比例
subplots
提供了多种方法来改变图像的大小和比例。首先,我们可以在创建 Figure
对象时指定 figsize
参数来设置图像的大小,其默认值为 (6.4, 4.8)
,单位是英寸。
# 设置图像的大小为 8x6 英寸
fig, ax = plt.subplots(figsize=(8, 6))
此外,我们还可以使用 subplots_adjust
方法来调整图像的边距和间距,以便更好地适应某些输出设备。下面的代码将演示如何调整图像的边距和间距:
# 生成随机数据
y1 = np.sin(x)
y2 = np.cos(x)
# 创建一个包含 1 行 2 列的图像
fig, axes = plt.subplots(nrows=1, ncols=2)
# 在第一个子图上绘制数据
axes[0].plot(x, y1)
axes[0].set_title('Sin')
# 在第二个子图上绘制数据
axes[1].plot(x, y2)
axes[1].set_title('Cos')
# 调整图像的边距和间距
plt.subplots_adjust(left=0.1, right=0.9, bottom=0.1, top=0.9, wspace=0.4, hspace=0.4)
上述代码将生成一个包含 1 行 2 列的图像,每个子图上都绘制有不同的随机数据。
5. 高级使用技巧
除了基本的使用方法之外,subplots
还支持一些高级的使用技巧,如共享坐标轴、设置标题和标签等。
5.1 共享坐标轴
当我们在一个图像中创建多个子图时,有时候我们会希望其中一些子图共享相同的坐标轴,以便更好地比较它们之间的数据。
例如,下面的代码将创建一个包含 2 行 2 列的图像,并设置第一行的子图共享 x 轴,第二列的子图共享 y 轴:
# 生成随机数据
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
# 创建 2x2 的图像,并将其分割成 4 个子图
fig, axes = plt.subplots(nrows=2, ncols=2, sharex='col', sharey='row')
# 在第一行的子图上绘制数据
axes[0, 0].plot(x, y1)
axes[0, 0].set_title('Sin')
axes[0, 1].plot(x, y2)
axes[0, 1].set_title('Cos')
# 在第二行的子图上绘制数据
axes[1, 0].plot(x, y3)
axes[1, 0].set_title('Tan')
# 调整子图之间的距离
plt.tight_layout()
上述代码将生成一个包含 2 行 2 列的图像,其中第一行的子图共享 x 轴,第二列的子图共享 y 轴。
5.2 设置标题和标签
我们可以使用 set_title
方法为图像设置标题,使用 set_xlabel
和 set_ylabel
方法为坐标轴设置标签。这些方法接受一个字符串作为参数,并将其用作标题或标签的文本。
例如,下面的代码将创建一个包含 2 行 2 列的图像,并为每个子图设置不同的标题和坐标轴标签:
# 生成随机数据
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x)
# 创建 2x2 的图像,并将其分割成 4 个子图
fig, axes = plt.subplots(nrows=2, ncols=2)
# 在第一个子图上绘制数据,并设置标题和坐标轴标签
axes[0, 0].plot(x, y1)
axes[0, 0].set_title('Sin')
axes[0, 0].set_xlabel('x')
axes[0, 0].set_ylabel('y')
# 在第二个子图上绘制数据,并设置标题和坐标轴标签
axes[0, 1].plot(x, y2)
axes[0, 1].set_title('Cos')
axes[0, 1].set_xlabel('x')
axes[0, 1].set_ylabel('y')
# 在第三个子图上绘制数据,并设置标题和坐标轴标签
axes[1, 0].plot(x, y3)
axes[1, 0].set_title('Tan')
axes[1, 0].set_xlabel('x')
axes[1, 0].set_ylabel('y')
# 在第四个子图上绘制数据,并设置标题和坐标轴标签
axes[1, 1].plot(x, y4)
axes[1, 1].set_title('Exp')
axes[1, 1].set_xlabel('x')
axes[1, 1].set_ylabel('y')
# 调整子图之间的距离
plt.tight_layout()
上述代码将生成一个包含 2 行 2 列的图像,每个子图上都绘制有不同的随机数据,并为每个子图设置了标题和坐标轴标签。
6. 总结
本文详细介绍了 matplotlib subplots
的基本概念、常用方法以及一些高级使用技巧。我们可以使用 subplots
在一个图像中创建和管理多个子图,并通过调整图像的大小、坐标轴、标题和标签等来更清晰地展示和比较不同的数据。