1.2 Figure 和 Axes 对象 Matplotlib Figure 和 Axes 对象详解:构建图表的基础 Matplotlib 是 Python 中最流行的绘图库之一,它提供了强大的工具,用于创建各种静态、动态、交互式的可视化图表。在 Matplotlib 的世界中,Figure (画布) 和 Axes (坐标轴) 是构建任何图表的核心和基础。理解这两个对象的概念及其相互关系,是掌握 Matplotlib 的关键第一步。 1.2.1 Figure 对象:画布 – 图表的容器 在 Matplotlib 中,Figure 对象代表整个图表。你可以将其想象成一块画布,所有的绘图元素,例如坐标轴 (Axes)、标题、图例、文本注释等,都将绘制在这块画布上。
Matplotlib 是 Python 中最流行的绘图库之一,它提供了强大的工具,用于创建各种静态、动态、交互式的可视化图表。在 Matplotlib 的世界中,Figure (画布) 和 Axes (坐标轴) 是构建任何图表的核心和基础。理解这两个对象的概念及其相互关系,是掌握 Matplotlib 的关键第一步。
在 Matplotlib 中,Figure 对象代表整个图表。你可以将其想象成一块画布,所有的绘图元素,例如坐标轴 (Axes)、标题、图例、文本注释等,都将绘制在这块画布上。一个 Figure 可以包含一个或多个 Axes 对象,以及其他类型的 "Artist" 对象(Artist 是 Matplotlib 中所有可见元素的基类)。
最简单的方式是使用 matplotlib.pyplot 模块(通常简写为 plt)中的 figure() 函数来创建一个 Figure 对象。
import matplotlib.pyplot as plt # 创建一个新的 Figure 对象 fig = plt.figure() # 显示 Figure 对象 (可选,在某些环境下会自动显示) plt.show()
这段代码会创建一个空白的 Figure 对象。如果你运行这段代码,可能会看到一个空白的窗口弹出(取决于你的 Matplotlib 配置和运行环境,例如 Jupyter Notebook 或独立的 Python 脚本)。
代码详解:
import matplotlib.pyplot as plt: 导入 matplotlib.pyplot 模块并将其命名为 plt。这是 Matplotlib 中最常用的模块,提供了类似于 MATLAB 的绘图接口。
fig = plt.figure(): 调用 plt.figure() 函数创建一个新的 Figure 对象,并将返回的 Figure 对象赋值给变量 fig。
plt.show(): 显示所有打开的 Figure 对象。在脚本中,通常需要调用 plt.show() 来显示图表。在交互式环境(如 Jupyter Notebook)中,通常可以省略 plt.show(),图表会自动显示。
Figure 对象拥有许多属性和方法,用于控制画布的各个方面,例如大小、背景颜色、标题等。
常用属性:
figsize: 设置 Figure 的尺寸,以英寸为单位,是一个二元元组 (width, height)。
dpi: 每英寸点数 (dots per inch),影响图像的像素密度和最终输出质量。
facecolor: Figure 的背景颜色。
edgecolor: Figure 边缘的颜色。
常用方法:
add_axes(rect, **kwargs): 向 Figure 中添加一个新的 Axes 对象,rect 定义了 Axes 在 Figure 中的位置和大小,是一个列表 [left, bottom, width, height],值介于 0 和 1 之间,代表 Figure 宽高的比例。
add_subplot(*args, **kwargs): 向 Figure 中添加一个新的子图 (Axes 对象),更方便地创建网格布局的子图。
suptitle(t, **kwargs): 为 Figure 添加一个总标题,显示在所有 Axes 之上。
savefig(fname, **kwargs): 将 Figure 保存到文件,支持多种图像格式 (PNG, JPG, SVG, PDF 等)。
代码实践:自定义 Figure 对象
import matplotlib.pyplot as plt # 创建一个 Figure 对象,设置尺寸和背景颜色 fig = plt.figure(figsize=(8, 6), facecolor='lightgray') # 添加 Figure 总标题 fig.suptitle('Customized Figure Example', fontsize=16, color='darkblue') # 显示 Figure 对象 plt.show()
这段代码创建了一个尺寸为 8x6 英寸,背景颜色为浅灰色的 Figure 对象,并添加了一个深蓝色的总标题。
我们可以用 Mermaid 的 graph TD 图来可视化 Figure 对象的结构:
图表解释:
Figure (画布) 是最顶层的容器。
Axes Object(s):Figure 中可以包含一个或多个 Axes 对象,用于实际的绘图区域。
Artist Objects (Other Artists...):Figure 还可以包含其他 Artist 对象,例如 Figure 的总标题、图例等,这些元素都属于 Figure 的一部分。
Axes 对象是 Matplotlib 中进行实际绘图操作的核心。它代表了图表中的坐标轴区域,是我们绘制线条、散点、柱状图等各种图表的场所。一个 Figure 对象可以包含多个 Axes 对象,形成子图 (subplots)。
注意: 容易混淆的概念是 "axes" 和 "axis"。Axes (复数) 指的是整个坐标轴区域,包括 x 轴、y 轴、绘图区域、标题、标签等。而 Axis (单数) 指的是坐标轴本身,例如 x 轴或 y 轴。
Axes 对象通常通过 Figure 对象来创建和添加。以下是几种常用的创建 Axes 对象的方法:
fig.add_axes(rect): 在 Figure 中添加一个自定义位置和大小的 Axes 对象。
fig.add_subplot(*args, **kwargs): 在 Figure 中添加一个子图 (Axes 对象),可以指定子图的网格布局。
plt.axes(rect, **kwargs): 使用 pyplot 模块直接创建一个 Axes 对象并添加到当前的 Figure 中(如果不存在 Figure,则会自动创建一个)。
plt.subplot(*args, **kwargs): 使用 pyplot 模块直接创建一个子图 (Axes 对象) 并添加到当前的 Figure 中。
代码实践:创建不同类型的 Axes 对象
import matplotlib.pyplot as plt import numpy as np # 创建 Figure 对象 fig = plt.figure(figsize=(10, 8)) # 1. 使用 add_axes 创建自定义位置和大小的 Axes ax1 = fig.add_axes([0.1, 0.6, 0.3, 0.3]) # [left, bottom, width, height] 比例 ax1.set_title('axes([0.1, 0.6, 0.3, 0.3])') # 2. 使用 add_subplot 创建子图 (2行2列的第一个) ax2 = fig.add_subplot(2, 2, 1) # (rows, cols, index) ax2.set_title('subplot(2, 2, 1)') # 3. 使用 plt.axes 创建 Axes (默认位置和大小) ax3 = plt.axes([0.5, 0.1, 0.4, 0.4]) # 注意:这里会添加到当前的 Figure (fig) 中 ax3.set_title('plt.axes([0.5, 0.1, 0.4, 0.4])') # 4. 使用 plt.subplot 创建子图 (2行2列的第二个) ax4 = plt.subplot(2, 2, 2) # 注意:这里也会添加到当前的 Figure (fig) 中 ax4.set_title('plt.subplot(2, 2, 2)') # 在 Axes 上绘制一些简单的图形 (示例) x = np.linspace(0, 10, 100) y = np.sin(x) ax1.plot(x, y, color='red') ax2.scatter(x, y, color='green', marker='o') ax3.bar(range(5), [10, 15, 7, 12, 9], color='blue') ax4.plot(x, np.cos(x), color='purple', linestyle='--') plt.show()
代码详解:
fig.add_axes([0.1, 0.6, 0.3, 0.3]): 在 Figure 中添加一个 Axes 对象,其左下角坐标位于 Figure 宽度的 10% 和高度的 60% 处,宽度和高度分别占 Figure 宽高的 30%。
fig.add_subplot(2, 2, 1): 在 Figure 中创建一个 2x2 的子图网格,并选择第一个子图 (索引为 1)。子图的编号顺序是按行优先从 1 开始计数。
plt.axes([0.5, 0.1, 0.4, 0.4]) 和 plt.subplot(2, 2, 2): 使用 plt.axes() 和 plt.subplot() 函数,它们会自动获取当前的 Figure 对象(如果存在),并将创建的 Axes 或子图添加到该 Figure 中。如果没有 Figure 对象,则会自动创建一个新的 Figure。
ax1.set_title(...), ax2.set_title(...) 等: 使用 ax.set_title() 方法为每个 Axes 对象设置标题,方便区分不同的 Axes。
ax1.plot(x, y, ...), ax2.scatter(x, y, ...) 等: 在不同的 Axes 对象上绘制不同的图形,例如折线图、散点图、柱状图等,演示如何在不同的 Axes 上进行绘图操作。
Axes 对象也拥有丰富的属性和方法,用于控制坐标轴的各个方面,例如标题、标签、刻度、轴的范围、网格线等。
常用属性:
title: Axes 的标题。
xlabel: x 轴的标签。
ylabel: y 轴的标签。
xlim: x 轴的范围,是一个二元元组 (xmin, xmax)。
ylim: y 轴的范围,是一个二元元组 (ymin, ymax)。
xticks: x 轴刻度的位置。
yticks: y 轴刻度的位置。
xticklabels: x 轴刻度的标签。
yticklabels: y 轴刻度的标签。
常用方法:
set_title(label, **kwargs): 设置 Axes 的标题。
set_xlabel(label, **kwargs): 设置 x 轴的标签。
set_ylabel(label, **kwargs): 设置 y 轴的标签。
set_xlim(xmin, xmax): 设置 x 轴的范围。
set_ylim(ymin, ymax): 设置 y 轴的范围。
set_xticks(ticks): 设置 x 轴刻度的位置。
set_yticks(ticks): 设置 y 轴刻度的位置。
set_xticklabels(labels): 设置 x 轴刻度的标签。
set_yticklabels(labels): 设置 y 轴刻度的标签。
grid(True, **kwargs): 显示网格线。
plot(*args, **kwargs): 绘制折线图。
scatter(*args, **kwargs): 绘制散点图。
bar(*args, **kwargs): 绘制柱状图。
hist(*args, **kwargs): 绘制直方图。
legend(*args, **kwargs): 显示图例。
代码实践:自定义 Axes 对象
import matplotlib.pyplot as plt import numpy as np # 创建 Figure 和 Axes 对象 fig, ax = plt.subplots(figsize=(8, 6)) # 生成数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 绘制折线图 ax.plot(x, y, label='sin(x)', color='blue', linestyle='-') # 设置 Axes 标题和标签 ax.set_title('Customized Axes Example', fontsize=14) ax.set_xlabel('X-axis', fontsize=12) ax.set_ylabel('Y-axis', fontsize=12) # 设置 x 和 y 轴的范围 ax.set_xlim(0, 10) ax.set_ylim(-1.2, 1.2) # 设置 x 和 y 轴的刻度 ax.set_xticks([0, 2, 4, 6, 8, 10]) ax.set_yticks([-1, -0.5, 0, 0.5, 1]) # 添加网格线 ax.grid(True, linestyle='--', alpha=0.7) # 显示图例 ax.legend() # 显示 Figure plt.show()
这段代码创建了一个包含一个 Axes 对象的 Figure,并在 Axes 上绘制了正弦曲线。代码中演示了如何设置 Axes 的标题、标签、轴范围、刻度、网格线和图例等属性。
我们可以用 Mermaid 的 graph TD 图来可视化 Axes 对象的结构:
图表解释:
Axes (坐标轴区域) 是实际绘图的核心区域。
XAxis 和 YAxis: 代表 x 轴和 y 轴。
Plotting Area: 实际绘制图形的区域。
Title, X Label, Y Label: Axes 的标题和轴标签。
XTicks & Labels, YTicks & Labels: x 轴和 y 轴的刻度和刻度标签。
Grid Lines: 网格线。
Spines (Axes Borders): Axes 的边框线。
Data Plots (Lines, Bars...): 在 Axes 上绘制的各种数据图表。
Legend: 图例。
Figure 和 Axes 对象之间存在明显的层级关系:Figure 是容器,Axes 是 Figure 中的绘图区域。一个 Figure 可以包含多个 Axes,通过不同的布局方式,可以创建出复杂的图表,例如包含多个子图的图表。
Mermaid 图:Figure 和 Axes 的层级关系
图表解释:
Figure Object 是顶层对象,用粗边框和浅绿色填充表示。
Axes Object 1, Axes Object 2, Axes Object N 代表 Figure 中包含的多个 Axes 对象,用浅蓝色填充表示。
箭头表示 Figure 对象包含 Axes 对象,线条粗细表示层级关系。
理解这种层级关系非常重要,因为在 Matplotlib 中,我们通常先创建 Figure 对象,然后在 Figure 对象中添加 Axes 对象,最后在 Axes 对象上进行绘图操作。
子图是 Figure 中多个并排排列的 Axes 对象,常用于比较不同数据集或不同类型的图表。Matplotlib 提供了多种方法创建子图,例如 plt.subplot() 和 fig.add_subplot()。
代码实践:创建子图
import matplotlib.pyplot as plt import numpy as np # 创建 Figure 对象 fig = plt.figure(figsize=(12, 8)) # 创建 2x2 的子图网格 ax1 = fig.add_subplot(2, 2, 1) # 第一行第一列 ax2 = fig.add_subplot(2, 2, 2) # 第一行第二列 ax3 = fig.add_subplot(2, 2, 3) # 第二行第一列 ax4 = fig.add_subplot(2, 2, 4) # 第二行第二列 # 在每个子图上绘制不同的图形 x = np.linspace(0, 10, 100) ax1.plot(x, np.sin(x), color='red') ax2.scatter(x, np.cos(x), color='green') ax3.bar(range(5), [20, 15, 25, 10, 30], color='blue') ax4.hist(np.random.randn(1000), bins=30, color='purple', alpha=0.7) # 设置子图的标题 (可选) ax1.set_title('Sine Wave') ax2.set_title('Cosine Wave') ax3.set_title('Bar Chart') ax4.set_title('Histogram') # 调整子图之间的间距,避免重叠 (可选) plt.tight_layout() # 显示 Figure plt.show()
这段代码创建了一个 2x2 的子图网格,并在每个子图上绘制了不同的图形。plt.tight_layout() 函数用于自动调整子图之间的间距,避免标题或标签重叠。
Figure 和 Axes 对象是 Matplotlib 中构建图表的基础。理解它们的概念和关系对于有效地使用 Matplotlib 至关重要。
Figure 对象 (画布) 是整个图表的容器,可以包含一个或多个 Axes 对象以及其他 Artist 对象。
Axes 对象 (坐标轴) 是实际的绘图区域,我们所有的绘图操作都是在 Axes 对象上进行的。
Figure 和 Axes 之间存在层级关系:Figure 包含 Axes。
通过创建多个 Axes 对象,可以实现子图等复杂的图表布局。
掌握 Figure 和 Axes 对象的操作,是深入学习 Matplotlib,创建各种定制化图表的基石。在后续的学习中,我们将继续围绕 Figure 和 Axes 对象,探索更多高级的绘图技巧和功能。