面向对象接口
Matplotlib - 面向对象接口
Section titled “Matplotlib - 面向对象接口”虽然 matplotlib.pyplot 接口提供了一种快速生成图表的方式,但面向对象 (Object-Oriented, OO) API 提供了一种更健壮 (robust)、更明确 (explicit) 且更灵活 (flexible) 的方法。对于创建复杂图表、编写可复用的绘图函数、在应用程序中嵌入图表,以及通常对于任何非简单的可视化任务,都推荐使用面向对象的方法。
核心思想:Figures 和 Axes
Section titled “核心思想:Figures 和 Axes”面向对象方法围绕着显式创建和操作两个基本对象:
Figure:所有内容的顶层容器 (top-level container)。可以将其视为整个窗口或画布 (canvas)。Axes:Figure 内的单个图表。这是数据实际绘制的地方,它包含坐标轴线 (axes lines)、刻度 (ticks)、标签 (labels)、标题 (title) 等。
不再调用作用于隐式当前 figure/axes 的全局 pyplot 函数,而是直接在要修改的特定 Figure 和 Axes 对象上调用方法。
入门:plt.subplots()
Section titled “入门:plt.subplots()”开始使用面向对象接口最常见的方式是使用 plt.subplots()。此函数可以方便地同时创建一个 Figure 对象和一个或多个 Axes 对象。
import matplotlib.pyplot as pltimport numpy as np
# 创建一个 Figure 和一个 Axes 对象fig, ax = plt.subplots()
# 创建一个 Figure 和一个 2x1 的 Axes 对象网格# 'axs' 将是一个包含两个 Axes 对象的 NumPy 数组fig_multi, axs = plt.subplots(nrows=2, ncols=1)一旦有了 Axes 对象(例如,ax 或 axs[0]),就可以使用它们的各种方法进行绘图和定制 (customization)。
示例:使用 OO 接口绘制简单图表
Section titled “示例:使用 OO 接口绘制简单图表”import matplotlib.pyplot as pltimport numpy as np
# 数据x = np.linspace(0, 2 * np.pi, 100)y = np.sin(x)
# 1. 创建 Figure 和 Axesfig, ax = plt.subplots(figsize=(8, 5)) # 在此处控制图表尺寸
# 2. 在特定的 Axes 对象 ('ax') 上绘制数据ax.plot(x, y, label='sin(x)', color='purple')
# 3. 使用 Axes 方法定制图表ax.set_title("Sine Wave (Object-Oriented)", fontsize=16)ax.set_xlabel("Angle [radians]", fontsize=12)ax.set_ylabel("Sine Value", fontsize=12)ax.set_xlim(0, 2 * np.pi)ax.set_ylim(-1.2, 1.2)ax.grid(True)ax.legend()
# 4. 显示 Figure (使用 pyplot)plt.show()请注意,plot、set_title、set_xlabel、set_ylabel、grid、legend 等方法都是作为 ax 对象的方法被调用的,这明确指出了正在修改的是哪个图表。
为什么使用 OO 接口?
Section titled “为什么使用 OO 接口?”- 清晰性: 明确指定正在操作的是哪个 Figure/Axes,避免因隐式状态 (implicit state) 引起的混淆。
- 控制力: 提供对所有图表元素的更精细控制。
- 灵活性: 轻松管理多个 Figure 和复杂的子图布局 (subplot layouts)。
- 可复用性: 更容易编写创建或修改图表的函数,因为可以将 Figure/Axes 对象作为参数传递。
- 嵌入: 在 GUI 应用程序或 Web 框架中嵌入 Matplotlib 图表时必不可少。
虽然 pyplot 对于快速的交互式探索 (interactive exploration) 来说很好用,但对于开发更结构化且易于维护的绘图代码,强烈建议采用面向对象 API。
(注意:您仍然可以使用 plt.figure() 创建一个空的 Figure,然后使用 fig.add_subplot() 或 fig.add_axes() 手动添加 Axes,但对于常见布局,plt.subplots() 通常更直接。)