2、Matplotlib快速上手:架构、对象与绘图流程
说实话,Matplotlib 是我最早接触的可视化库。那时候刚入行,领导丢给我一堆数据,说「画个图看看」。我打开文档,密密麻麻的 API 直接把我整懵了。后来我才明白,搞懂它的架构,比背一百个函数都管用。
这一节,咱们就聊聊 Matplotlib 的核心骨架。你把它想成一辆车——Figure 是车身,Axes 是驾驶舱,而绘图流程就是你踩油门、打方向盘的动作。搞懂这些,后面画什么图都顺手。
2.1 Matplotlib 架构简介
Matplotlib 分三层,我习惯叫它「三明治架构」:
- 后端层(Backend):负责把图形渲染到屏幕上或保存成文件。你平时看到的画布、窗口,都是它在干活。
- 艺术家层(Artist):所有你能看到的元素——线条、文字、坐标轴——都是 Artist 对象。说白了,图上的每个像素都是某个 Artist 画出来的。
- 脚本层(pyplot):我们最常用的接口。它封装了底层细节,让你几行代码就能出图。
嗯,这里要注意:pyplot 是方便,但别依赖它写复杂逻辑。我在项目中遇到过,有人用 pyplot 画了 50 个子图,结果想改个标题,找了半天不知道改哪个。后来我全改成面向对象的方式,清爽多了。
核心观点:用 pyplot 快速验证,用 Artist 精细控制。两者不冲突,但你要知道什么时候该切换。
2.2 Figure 与 Axes 对象
这两个对象,你无论如何都得记住。我刚开始总把 Figure 和 Axes 搞混,后来一个老同事跟我说:Figure 是画板,Axes 是画纸。一张画板上可以贴多张画纸,每张画纸有自己的坐标系。
| 对象 | 作用 | 类比 |
|---|---|---|
| Figure | 整个图形窗口,包含所有元素 | 画板 / 画布 |
| Axes | 实际绘图区域,有坐标轴、刻度 | 画纸 / 子图 |
| Axis | 坐标轴(X轴、Y轴) | 画纸上的标尺 |
💡 我的小技巧:创建 Figure 时,用 fig, ax = plt.subplots() 一步到位。这样你手里就握着两个对象,想怎么操作都行。别用 plt.figure() 再 plt.gca() 绕一圈,容易乱。
2.3 基本绘图流程
绘图流程其实就四步,我总结成「创建-绘制-修饰-展示」:
- 创建画布和子图:
fig, ax = plt.subplots() - 绘制数据:
ax.plot(x, y)或ax.scatter(x, y) - 修饰图表:加标题、标签、图例、网格
- 展示或保存:
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;搞不懂,你就会被它牵着鼻子走。我当年就是吃了这个亏,希望你不用再走一遍。
可可精品资料库