坐标轴(或子图)简介#
Matplotlib Axes
是创建数据可视化的入口。一旦将坐标轴放置在图形上,就可以使用许多方法向坐标轴添加数据。坐标轴通常有一对 Axis
艺术家,它们定义了数据坐标系,并包括添加诸如 x 轴和 y 轴标签、标题和图例之类的注释的方法。
在上图中,坐标轴对象是使用 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()')
坐标轴是使用 Figure
对象上的方法或通过 pyplot
接口添加的。这些方法在 创建图形 和 在图形中排列多个坐标轴 中有更详细的讨论。但是,例如 add_axes
将在页面上手动定位坐标轴。在上面的示例中,subplots
在图形上放置了一个子图网格,并且 axs
是坐标轴的 (2, 2) 数组,每个坐标轴都可以添加数据。
还有许多其他方法可以将坐标轴添加到图形中
Figure.add_axes
:手动定位坐标轴。fig.add_axes([0, 0, 1, 1])
创建一个填充整个图形的坐标轴。pyplot.subplots
和Figure.subplots
:添加如上例所示的坐标轴网格。pyplot 版本返回图形对象和坐标轴数组。请注意,fig, ax = plt.subplots()
将单个坐标轴添加到图形。pyplot.subplot_mosaic
和Figure.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)
请注意,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()
这些方法相对简单,尽管可以在文本对象上设置许多文本属性和布局,例如 *fontsize*、*fontname*、*horizontalalignment*。图例可能更复杂;有关更多详细信息,请参阅图例指南。
轴限制、刻度和刻度#
每个轴都有两个(或更多)Axis
对象,可以通过xaxis
和yaxis
属性访问。这些对象上有大量方法,对于高度可定制的轴,阅读Axis
处的API非常有用。但是,轴类为这些方法中最常用的方法提供了许多辅助函数。实际上,上面讨论的set_xlabel
是set_label_text
的辅助函数。
其他重要方法设置轴的范围(set_xlim
,set_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])
轴类还具有用于处理轴刻度及其标签的辅助函数。最直接的是set_xticks
和set_yticks
,它们手动设置刻度位置,并可选择设置其标签。可以使用minorticks_on
或minorticks_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')
除了这些轴级辅助函数之外,对刻度的更精细控制、设置刻度以及控制轴都可以进行高度自定义。
轴布局#
有时,在数据空间中设置绘图的纵横比很重要,我们可以使用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')