2、Matplotlib快速上手:架构、对象与绘图流程

说实话,Matplotlib 是我最早接触的可视化库。那时候刚入行,领导丢给我一堆数据,说「画个图看看」。我打开文档,密密麻麻的 API 直接把我整懵了。后来我才明白,搞懂它的架构,比背一百个函数都管用。

这一节,咱们就聊聊 Matplotlib 的核心骨架。你把它想成一辆车——Figure 是车身,Axes 是驾驶舱,而绘图流程就是你踩油门、打方向盘的动作。搞懂这些,后面画什么图都顺手。

2.1 Matplotlib 架构简介

Matplotlib 分三层,我习惯叫它「三明治架构」:

  • 后端层(Backend):负责把图形渲染到屏幕上或保存成文件。你平时看到的画布、窗口,都是它在干活。
  • 艺术家层(Artist):所有你能看到的元素——线条、文字、坐标轴——都是 Artist 对象。说白了,图上的每个像素都是某个 Artist 画出来的。
  • 脚本层(pyplot):我们最常用的接口。它封装了底层细节,让你几行代码就能出图。

嗯,这里要注意:pyplot 是方便,但别依赖它写复杂逻辑。我在项目中遇到过,有人用 pyplot 画了 50 个子图,结果想改个标题,找了半天不知道改哪个。后来我全改成面向对象的方式,清爽多了。

核心观点:用 pyplot 快速验证,用 Artist 精细控制。两者不冲突,但你要知道什么时候该切换。

Matplotlib 三层架构 后端层(Backend) 渲染引擎:Agg、TkAgg、QtAgg、SVG、PDF ... 艺术家层(Artist) Figure、Axes、Line2D、Text、Patch ... 脚本层(pyplot) plt.plot()、plt.xlabel()、plt.title() ...

2.2 Figure 与 Axes 对象

这两个对象,你无论如何都得记住。我刚开始总把 Figure 和 Axes 搞混,后来一个老同事跟我说:Figure 是画板,Axes 是画纸。一张画板上可以贴多张画纸,每张画纸有自己的坐标系。

对象 作用 类比
Figure 整个图形窗口,包含所有元素 画板 / 画布
Axes 实际绘图区域,有坐标轴、刻度 画纸 / 子图
Axis 坐标轴(X轴、Y轴) 画纸上的标尺

💡 我的小技巧:创建 Figure 时,用 fig, ax = plt.subplots() 一步到位。这样你手里就握着两个对象,想怎么操作都行。别用 plt.figure() 再 plt.gca() 绕一圈,容易乱。

2.3 基本绘图流程

绘图流程其实就四步,我总结成「创建-绘制-修饰-展示」:

  1. 创建画布和子图:fig, ax = plt.subplots()
  2. 绘制数据:ax.plot(x, y) 或 ax.scatter(x, y)
  3. 修饰图表:加标题、标签、图例、网格
  4. 展示或保存:plt.show() 或 fig.savefig()

举个例子,你一看就明白:

import matplotlib.pyplot as plt
import numpy as np

# 1. 创建画布和子图
fig, ax = plt.subplots(figsize=(8, 5))

# 2. 绘制数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
ax.plot(x, y, label='sin(x)', color='#2ecc71', linewidth=2)

# 3. 修饰图表
ax.set_title('正弦函数曲线', fontsize=14)
ax.set_xlabel('X 轴', fontsize=12)
ax.set_ylabel('Y 轴', fontsize=12)
ax.legend()
ax.grid(True, linestyle='--', alpha=0.6)

# 4. 展示
plt.show()

你看,就这么几行。但我要提醒你:别把代码全写在一个单元格里。我见过有人把 200 行的绘图代码堆在一起,改个颜色要找半天。我的习惯是:数据准备、绘图、修饰、保存,各写一个函数。

⚠️ 我曾经踩过的坑:在 Jupyter Notebook 里,如果多次执行 plt.show(),图形会重叠。后来我改用 fig.clf() 清空画布,或者每次重新创建 Figure 对象。嗯,这个坑你大概率也会遇到。

2.4 保存图表

保存图表看似简单,但细节不少。我常用的保存方式:

# 保存为 PNG(默认)
fig.savefig('output.png', dpi=300, bbox_inches='tight')

# 保存为 PDF(矢量图,适合论文)
fig.savefig('output.pdf', bbox_inches='tight')

# 保存为 SVG(可编辑矢量图)
fig.savefig('output.svg', bbox_inches='tight')
参数 作用 推荐值
dpi 分辨率(每英寸点数) 屏幕用 100,打印用 300
bbox_inches='tight' 自动裁剪空白边距 强烈建议加上
transparent=True 背景透明 适合嵌入 PPT 或网页

💡 我的习惯:开发阶段用 plt.show() 看效果,最终定稿用 fig.savefig() 保存。而且我一般同时保存 PNG 和 PDF 两份,一份预览,一份备用。

你想想看,如果每次都要手动调整边距、分辨率,那得多烦?所以我把保存逻辑封装成一个函数,传个文件名和 Figure 对象就行。这样既统一,又省事。

好了,Matplotlib 的快速上手就聊到这儿。记住:Figure 是画板,Axes 是画纸,绘图流程就是「创建-绘制-修饰-保存」。下一节咱们会深入聊各种图表的绘制技巧,到时候这些基础概念会反复用到。

一句话总结:搞懂架构,你就能驾驭 Matplotlib;搞不懂,你就会被它牵着鼻子走。我当年就是吃了这个亏,希望你不用再走一遍。

可可精品资料库