Matplotlib - 面向对象接口
Matplotlib 中的 面向对象接口 是一种创建图表的途径,它涉及显式创建和操作代表图表不同元素的对象。在此上下文中,接口 指的是库提供的用于创建可视化的不同编程方法或风格。
Matplotlib 中的接口
Matplotlib 提供了两种主要方法来创建图表 —
- 函数式接口(也称为隐式或 pyplot 接口)和
- 面向对象接口(称为显式或 Axes 接口)。
函数式接口 (Pyplot)
函数式接口,也称为 pyplot 接口,是一种隐式且基于状态的方法。它跟踪最近创建的 Figure 和 Axes,并隐式地将 artists 添加到对象中,因为它假设用户需要该 artist。此接口适合快速生成和修改图表,但对于复杂图表可能缺乏可扩展性。
示例 - 创建图表
以下是一个使用隐式 “pyplot” 接口创建图表的简单示例。
import matplotlib.pyplot as plt plt.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2]) plt.show()
输出
执行上述代码后,您将得到以下输出 —
面向对象接口
另一方面,面向对象接口提供了对 Figure 和 Axes 对象创建的显式控制。它涉及创建这些对象的实例,并逐步调用它们的方法来构建可视化。这种方法更具结构化,推荐用于复杂和多图表场景。
使用更正式的面向对象方法的要点是创建 figure 对象,然后直接在其上调用方法或属性。这种方法有助于更好地处理包含多个图表的画布。
在面向对象接口中,Pyplot 仅用于少数函数,如 figure 创建,用户显式创建并跟踪 figure 和 axes 对象。在此级别,用户使用 Pyplot 创建 figures,并通过这些 figures 创建一个或多个 axes 对象。这些 axes 对象随后用于大多数绘图操作。
示例 - 面向对象接口
此示例使用面向对象接口创建一个简单图表。
import matplotlib.pyplot as plt # 创建一个 Figure 实例 fig = plt.figure() # 使用 subplots 方法创建 Axes 对象 ax = fig.subplots() # 绘制数据 ax.plot([1, 2, 3, 4], [0, 0.5, 1, 0.2]) # 显示图表 plt.show()
输出
执行上述代码后,您将得到以下输出 —
两种接口的区别
从上述两个示例中,您可以观察到两种方法的区别。函数式方法使用 plt.plot() 函数,该函数属于 matplotlib.pyplot 家族。
而 ax.plot() 函数是所有 Figure 对象可用的方法,具体来说是 Axes 方法。这遵循面向对象方法,其中创建一个 Figure 对象,并显式引用和使用 Axes 对象来逐步构建图表。
使用面向对象接口
在这种方法中,图表被构建为一个 Figure 对象,它充当画布,而 artists 是构成最终图形图像的元素。Axes 类表示单个图表,一个 Figure 可以包含多个 Axes 对象。
示例 - 创建 Figure 和 Axes 对象
在这个示例中,我们显式创建一个 Figure 和一个 Axes 对象,为自定义和构建复杂可视化提供基础。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
# 创建 Figure 实例
fig, ax = plt.subplots(figsize=(7,4))
# 绘制数据
ax.plot(x, y)
# 自定义图表
ax.set_title("Sine Wave")
ax.set_xlabel('x_label')
ax.set_ylabel('y_label')
# 显示图表
plt.show()
输出
执行上述代码后,您将得到以下输出 −
在 OO 接口中创建子图
要在面向对象接口中创建子图,我们显式创建 Figure 和 Axes 对象,从而对布局和自定义获得更多控制。
示例 - 使用 OO 接口创建子图
以下示例使用面向对象接口创建子图。
import matplotlib.pyplot as plt
import numpy as np
# 示例数据
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x**2)
y2 = np.cos(x**2)
# 创建子图
fig, axs = plt.subplots(2, figsize=(7,4))
fig.suptitle('Creating Subplots in explicit interface')
# 在各个子图上绘制数据
axs[0].plot(x, y1)
axs[1].plot(x, y2)
# 为子图添加标题
axs[0].set_title('Sin Plot')
axs[1].set_title('Cos Plot')
# 调整布局
plt.tight_layout()
# 显示图表
plt.show()
输出
执行上述代码后,您将得到以下输出 −
