坐标轴(或子图)简介#

Matplotlib Axes 是创建数据可视化的入口。一旦将坐标轴放置在图形上,就可以使用许多方法向坐标轴添加数据。坐标轴通常有一对 Axis 艺术家,它们定义了数据坐标系,并包括添加诸如 x 轴和 y 轴标签、标题和图例之类的注释的方法。

../../../_images/anatomy.png

图形的解剖#

在上图中,坐标轴对象是使用 ax = fig.subplots() 创建的。图形上的所有其他内容都是使用此 ax 对象上的方法创建的,或者可以从中访问。如果我们想更改 x 轴上的标签,我们调用 ax.set_xlabel('New Label'),如果我们想绘制一些数据,我们调用 ax.plot(x, y)。实际上,在上图中,唯一不属于坐标轴的艺术家是图形本身,因此 axes.Axes 类实际上是 Matplotlib 大部分功能的入口。

请注意,坐标轴对于 Matplotlib 的操作至关重要,因此这里的大部分材料与 快速入门指南 中的内容重复。

创建坐标轴#

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()')

(源代码, 2x.png, png)

坐标轴是使用 Figure 对象上的方法或通过 pyplot 接口添加的。这些方法在 创建图形在图形中排列多个坐标轴 中有更详细的讨论。但是,例如 add_axes 将在页面上手动定位坐标轴。在上面的示例中,subplots 在图形上放置了一个子图网格,并且 axs 是坐标轴的 (2, 2) 数组,每个坐标轴都可以添加数据。

还有许多其他方法可以将坐标轴添加到图形中

  • Figure.add_axes:手动定位坐标轴。fig.add_axes([0, 0, 1, 1]) 创建一个填充整个图形的坐标轴。

  • pyplot.subplotsFigure.subplots:添加如上例所示的坐标轴网格。pyplot 版本返回图形对象和坐标轴数组。请注意,fig, ax = plt.subplots() 将单个坐标轴添加到图形。

  • pyplot.subplot_mosaicFigure.subplot_mosaic:添加命名坐标轴网格并返回坐标轴字典。对于 fig, axs = plt.subplot_mosaic([['left', 'right'], ['bottom', 'bottom']])axs['left'] 是左上角的坐标轴,axs['bottom'] 是横跨底部两列的坐标轴。

有关如何在图形上排列坐标轴网格的更多详细信息,请参阅 在图形中排列多个坐标轴

坐标轴绘图方法#

大多数高级绘图方法都可以从 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)

(源代码, 2x.png, png)

请注意,plot 返回一个*线*艺术家列表,可以随后进行操作,如 艺术家简介 中所述。

下面是一个非常不完整的绘图方法列表。同样,有关更多示例,请参阅 绘图类型,有关完整的方法列表,请参阅 axes.Axes

轴标签和注释#

通常我们希望使用xlabel、ylabel和title来标记轴,并且通常我们希望有一个图例来区分绘图元素。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()

(源代码, 2x.png, png)

这些方法相对简单,尽管可以在文本对象上设置许多文本属性和布局,例如 *fontsize*、*fontname*、*horizontalalignment*。图例可能更复杂;有关更多详细信息,请参阅图例指南

请注意,也可以使用textannotate将文本添加到轴。这可能相当复杂:有关更多信息,请参阅文本属性和布局注释

轴限制、刻度和刻度#

每个轴都有两个(或更多)Axis对象,可以通过xaxisyaxis属性访问。这些对象上有大量方法,对于高度可定制的轴,阅读Axis处的API非常有用。但是,轴类为这些方法中最常用的方法提供了许多辅助函数。实际上,上面讨论的set_xlabelset_label_text的辅助函数。

其他重要方法设置轴的范围(set_xlimset_ylim),或者更根本地设置轴的刻度。例如,我们可以使轴具有对数刻度,并放大数据的子部分

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])

(源代码, 2x.png, png)

轴类还具有用于处理轴刻度及其标签的辅助函数。最直接的是set_xticksset_yticks,它们手动设置刻度位置,并可选择设置其标签。可以使用minorticks_onminorticks_off来切换次刻度。

可以使用tick_params调整轴刻度和刻度标签的许多方面。例如,要标记轴的顶部而不是底部,将刻度着色为红色,并将刻度标签着色为绿色

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')

(源代码, 2x.png, png)

除了这些轴级辅助函数之外,对刻度的更精细控制、设置刻度以及控制轴都可以进行高度自定义。

轴布局#

有时,在数据空间中设置绘图的纵横比很重要,我们可以使用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')

(源代码, 2x.png, png)