图形与坐标轴架构
理解 Figure-Axes-Artist 层次结构,使用 plt.subplots() 创建图形,并区分无状态 API 与面向对象 API。
图形与坐标轴架构 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。
为什么要了解 Matplotlib 架构
Pandas 和 Seaborn 在内部都使用 Matplotlib。了解 Matplotlib 的对象层次结构后,您就可以控制图表的各个方面——从整体画布到单个刻度线——还可以将多个图表组合到同一个图形中。如果不了解 Figure-Axes 模型,自定义图表很快就会变成令人沮丧的猜测:不知道该调用哪个函数。
Figure:画布
Figure 是最外层的容器,也就是整个窗口或图像文件。它包含一个或多个 Axes 对象(实际的绘图区),以及标题、共享图例和空白区域。您可以使用 plt.figure() 创建 Figure,也可以通过 plt.subplots() 隐式创建。对 Figure 设置的大多数属性都会影响整个画布,例如大小、背景颜色和总标题。
import matplotlib.pyplot as plt
import numpy as np
# Create a Figure with a specific size
fig = plt.figure(figsize=(8, 4)) # width=8 inches, height=4 inches
print(type(fig)) # matplotlib.figure.Figure
print('Figure size:', fig.get_size_inches())
plt.close() # close to avoid display in scriptsAxes:绘图发生的地方
Axes 对象是 Figure 中的一个独立绘图区。它包含 x 轴、y 轴、刻度线、网格线以及所有可视元素(线条、柱形和散点)。大多数绘图调用都是 Axes 对象的方法:ax.plot()、ax.bar()、ax.scatter()。一个 Figure 可以包含多个 Axes,并将它们排列成子图网格。
fig, ax = plt.subplots() # Creates Figure + one Axes
print(type(ax)) # matplotlib.axes.Axes
x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x)) # plot on the Axes
plt.tight_layout()
# plt.show()
plt.close()plt.subplots():同时创建 Figure 和 Axes
plt.subplots(nrows, ncols) 是以网格布局创建包含一个或多个 Axes 的 Figure 的推荐方式。它会返回一个由 (fig, ax) 组成的元组(如果有多个子图,则返回 (fig, axes_array))。figsize 参数以英寸为单位设置整个画布的大小。为确保代码清晰,请始终将返回结果解包到有意义的变量中。
# Single plot
fig, ax = plt.subplots(figsize=(6, 4))
# 2 rows, 1 column
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 8))
# 2 rows, 2 columns
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
ax_top_left = axes[0, 0]
ax_top_right = axes[0, 1]
print('axes shape:', axes.shape) # (2, 2)
plt.close('all')面向对象 API 与有状态 API
Matplotlib 有两种使用风格。有状态的 pyplot API 使用 plt.plot()、plt.xlabel() 等函数,并作用于“当前”坐标轴,适合快速交互式探索。面向对象的 OO API 会显式调用 ax 对象的方法:ax.plot()、ax.set_xlabel()。对于生产代码和多面板图形,我们强烈推荐使用 OO API,因为它能明确指出正在修改哪个坐标轴。
x = [1, 2, 3, 4]
y = [1, 4, 9, 16]
# Stateful API (convenient but fragile)
# plt.plot(x, y)
# plt.xlabel('x')
# plt.title('Squares')
# Object-oriented API (preferred)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('x')
ax.set_title('Squares')
plt.close()Artist:构成图表的基本元素
Matplotlib 图表中所有可见的内容都是 Artist:Figure、Axes、线条、文本、图形块(表示条形的矩形)和标记。Figure-Axes-Artist 层级从最外层的容器逐级延伸到最小的可视元素。理解这一层级有助于您以编程方式定位和修改任意元素——例如,在图表绘制完成后更改某个特定条形的颜色。
fig, ax = plt.subplots()
line, = ax.plot([1, 2, 3], [1, 4, 9], color='blue', linewidth=2)
# Introspect the hierarchy
print('Figure:', type(fig))
print('Axes:', type(ax))
print('Line Artist:', type(line))
print('Line color:', line.get_color())
plt.close()Axis 对象:XAxis 和 YAxis
每个 Axes 都包含两个 Axis 对象(不要与 Axes 混淆):ax.xaxis 和 ax.yaxis。它们控制刻度、刻度标签和脊线(可见的线条)。您可以使用 ax.set_xlim() 和 ax.set_ylim() 设置坐标轴范围,使用 ax.set_xticks() 控制刻度频率,并使用 ax.xaxis.set_major_formatter() 设置标签格式。
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 40, 30, 70])
ax.set_xlim(0, 5)
ax.set_ylim(0, 80)
ax.set_xticks([1, 2, 3, 4])
ax.set_xticklabels(['Q1', 'Q2', 'Q3', 'Q4'])
ax.set_xlabel('Quarter')
ax.set_ylabel('Revenue')
plt.close()多面板图表中的共享坐标轴
创建子图网格时,将 sharex=True 或 sharey=True 传递给 plt.subplots(),即可链接各面板之间的坐标轴刻度。这意味着,缩放或平移某个子图时,所有共享该坐标轴的面板都会自动更新——当您比较多个组的时间序列,并且希望每个面板显示相同的 x 轴范围时,这一点至关重要。
import numpy as np
x = np.arange(10)
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(6, 5))
ax1.plot(x, x**2, color='blue')
ax1.set_title('Squares')
ax2.plot(x, x**3, color='red')
ax2.set_title('Cubes')
fig.suptitle('Powers of x') # shared figure title
plt.tight_layout()
plt.close()使用 tight_layout() 调整间距
plt.tight_layout()(或 fig.tight_layout())会自动调整子图参数,尽量减少标签、标题和刻度标记之间的重叠。请在调用 plt.show() 或 fig.savefig() 之前调用它。如需更精细的控制,请使用 plt.subplots_adjust(hspace=, wspace=) 手动设置子图之间的垂直和水平间距。
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
for i, ax in enumerate(axes.flat):
ax.plot([1, 2, 3], [i, i+1, i+2])
ax.set_title(f'Panel {i+1}')
ax.set_xlabel('x axis label')
ax.set_ylabel('y axis label')
fig.suptitle('Grid of Plots', y=1.02)
plt.tight_layout() # prevents overlapping labels
plt.close()从 subplots() 获取 Axes
当 plt.subplots(nrows, ncols) 返回多个 axes 时,它们会被封装在一个形状为 (nrows, ncols) 的 NumPy 数组中。您可以像索引任意二维数组一样对其进行索引:axes[0, 1] 表示第一行、第二列。使用 axes.flat 可以按行优先顺序遍历所有 axes,而不受网格形状影响——这对于将相同的格式应用到每个面板非常方便。
fig, axes = plt.subplots(2, 3, figsize=(12, 6))
# Access by row, column
axes[0, 0].set_title('Top Left')
axes[1, 2].set_title('Bottom Right')
# Iterate over all axes
for ax in axes.flat:
ax.set_xlabel('Time')
ax.set_ylabel('Value')
plt.tight_layout()
plt.close()移除未使用的 Axes
当您创建子图网格但没有使用每个面板时,空的 axes 仍会显示边框。调用 ax.set_visible(False) 或 fig.delaxes(ax) 可隐藏或移除未使用的 axes。一种常见做法是遍历 axes.flat,隐藏超出所绘制数据系列数量的所有面板,从而保持图表整洁。
fig, axes = plt.subplots(2, 3, figsize=(12, 6))
data_panels = 4 # only 4 plots needed in a 2x3 grid
for i, ax in enumerate(axes.flat):
if i < data_panels:
ax.plot([1, 2, 3], [i, i+1, i+2])
ax.set_title(f'Panel {i+1}')
else:
ax.set_visible(False) # hide extra panels
plt.tight_layout()
plt.close()快速检查
请检验您对本课 Matplotlib 的 Figure 和 Axes 架构的理解。
课程回顾
在本课中,您学习了:Figure 是完整的画布,而 Axes 是其中的单个绘图区域;plt.subplots() 会同时创建二者,并返回 (fig, ax);相比有状态的 pyplot API,更推荐使用面向对象 API(ax.plot()、ax.set_xlabel());tight_layout() 可以防止多面板图表中的标签重叠。接下来,我们将创建线形图和散点图,并全面控制其样式。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「图形与坐标轴架构」课时是免费的吗?
是的 — 「图形与坐标轴架构」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。
「图形与坐标轴架构」这节课中我会学到什么?
理解 Figure-Axes-Artist 层次结构,使用 plt.subplots() 创建图形,并区分无状态 API 与面向对象 API。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Pandas & NumPy Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「图形与坐标轴架构」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?
能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 图形与坐标轴架构
- 折线图与散点图
- 条形图与直方图
- 标签、标题与保存图形