坐标系(或子图)简介#
Matplotlib Axes
是创建数据可视化的门户。一旦 Axes 被放置在图(Figure)上,就可以使用许多方法向其添加数据。一个 Axes 通常包含一对 Axis
艺术对象(Artist),它们定义了数据坐标系,并包含用于添加注解的方法,例如 x 轴和 y 轴标签、标题和图例。

图(Figure)的构成#
在上图中,Axes 对象是通过 ax = fig.subplots()
创建的。图上的所有其他元素都是通过此 ax
对象的方法创建的,或者可以从它访问。如果我们要更改 x 轴上的标签,我们调用 ax.set_xlabel('New Label')
;如果我们要绘制数据,我们调用 ax.plot(x, y)
。事实上,在上图中,唯一不属于 Axes 的艺术对象是 Figure 本身,因此 axes.Axes
类确实是 Matplotlib 大部分功能的入口。
请注意,Axes 对 Matplotlib 的操作至关重要,因此这里的许多内容与 快速入门指南 中的内容是重复的。
创建 Axes#
import matplotlib.pyplot as plt
import numpy as np
fig, axs = plt.subplots(ncols=2, nrows=2, figsize=(3.5, 2.5),
layout="constrained")
# for each Axes, add an artist, in this case a nice label in the middle...
for row in range(2):
for col in range(2):
axs[row, col].annotate(f'axs[{row}, {col}]', (0.5, 0.5),
transform=axs[row, col].transAxes,
ha='center', va='center', fontsize=18,
color='darkgrey')
fig.suptitle('plt.subplots()')

Axes 是通过 Figure
对象上的方法,或通过 pyplot
接口添加的。这些方法在 创建 Figure 和 在 Figure 中排列多个 Axes 中有更详细的讨论。然而,例如 add_axes
将手动在页面上定位一个 Axes。在上面的示例中,subplots
在 figure 上放置了一个子图网格,而 axs
是一个 (2, 2) 的 Axes 数组,每个 Axes 都可以添加数据。
还有其他几种向 Figure 添加 Axes 的方法
Figure.add_axes
:手动定位 Axes。fig.add_axes([0, 0, 1, 1])
创建一个填充整个 figure 的 Axes。pyplot.subplots
和Figure.subplots
:添加一个 Axes 网格,如上例所示。pyplot 版本返回 Figure 对象和 Axes 数组。请注意,fig, ax = plt.subplots()
会向 Figure 添加一个 Axes。pyplot.subplot_mosaic
和Figure.subplot_mosaic
:添加一个由命名 Axes 组成的网格,并返回一个 axes 字典。对于fig, axs = plt.subplot_mosaic([['left', 'right'], ['bottom', 'bottom']])
,axs['left']
是左上角的 Axes,而axs['bottom']
是底部跨两列的 Axes。
有关如何在 Figure 上排列 Axes 网格的更多详细信息,请参阅 在 Figure 中排列多个 Axes。
Axes 绘图方法#
大多数高级绘图方法都从 axes.Axes
类访问。有关完整的精选列表,请参阅 API 文档;有关示例,请参阅 绘图类型。一个基本示例是 axes.Axes.plot
fig, ax = plt.subplots(figsize=(4, 3))
np.random.seed(19680801)
t = np.arange(100)
x = np.cumsum(np.random.randn(100))
lines = ax.plot(t, x)

请注意,plot
返回一个 lines 艺术对象(Artist)列表,这些对象随后可以被操作,这在 艺术对象(Artist)简介 中有所讨论。
Axes 标签和注解#
通常我们希望用 x 轴标签(xlabel)、y 轴标签(ylabel)和标题来标记 Axes,并且经常希望有一个图例来区分绘图元素。Axes
类有许多方法来创建这些注解。
fig, ax = plt.subplots(figsize=(5, 3), layout='constrained')
np.random.seed(19680801)
t = np.arange(200)
x = np.cumsum(np.random.randn(200))
y = np.cumsum(np.random.randn(200))
linesx = ax.plot(t, x, label='Random walk x')
linesy = ax.plot(t, y, label='Random walk y')
ax.set_xlabel('Time [s]')
ax.set_ylabel('Distance [km]')
ax.set_title('Random walk example')
ax.legend()

这些方法相对直接,尽管可以在文本对象上设置许多 文本属性和布局,例如 fontsize(字体大小)、fontname(字体名称)、horizontalalignment(水平对齐)。图例可能更为复杂;有关更多详细信息,请参阅 图例指南。
请注意,还可以使用 text
和 annotate
向 axes 添加文本。这可以非常复杂:有关更多信息,请参阅 文本属性和布局 和 注解。
Axes 限制、刻度尺和刻度#
每个 Axes 都有两个(或更多)Axis
对象,可以通过 xaxis
和 yaxis
属性访问。这些对象有大量方法,对于高度可定制的 Axis,查阅 Axis
的 API 文档会很有用。然而,Axes 类为这些最常用的方法提供了一些辅助函数。事实上,上面讨论的 set_xlabel
是 set_label_text
的一个辅助函数。
其他重要方法设置 axes 的范围(set_xlim
, set_ylim
),或更根本地设置 axes 的刻度尺。例如,我们可以使 Axis 具有对数刻度,并放大数据的某一部分
fig, ax = plt.subplots(figsize=(4, 2.5), layout='constrained')
np.random.seed(19680801)
t = np.arange(200)
x = 2**np.cumsum(np.random.randn(200))
linesx = ax.plot(t, x)
ax.set_yscale('log')
ax.set_xlim([20, 180])

Axes 类还提供了处理 Axis 刻度及其标签的辅助函数。最直接的方法是 set_xticks
和 set_yticks
,它们手动设置刻度位置和可选的刻度标签。次刻度(minor ticks)可以通过 minorticks_on
或 minorticks_off
进行切换。
Axes 刻度及其标签的许多方面都可以使用 tick_params
进行调整。例如,将标签置于 axes 顶部而不是底部,将刻度线颜色设为红色,刻度标签颜色设为绿色
fig, ax = plt.subplots(figsize=(4, 2.5))
ax.plot(np.arange(10))
ax.tick_params(top=True, labeltop=True, color='red', axis='x',
labelcolor='green')

除了这些 Axes 级别的辅助函数之外,对刻度线、刻度尺设置和 Axis 控制的更精细控制可以高度自定义。
Axes 布局#
有时,设置数据空间中绘图的宽高比很重要,我们可以使用 set_aspect
来完成此操作
fig, axs = plt.subplots(ncols=2, figsize=(7, 2.5), layout='constrained')
np.random.seed(19680801)
t = np.arange(200)
x = np.cumsum(np.random.randn(200))
axs[0].plot(t, x)
axs[0].set_title('aspect="auto"')
axs[1].plot(t, x)
axs[1].set_aspect(3)
axs[1].set_title('aspect=3')
