3. 二维图表绘制核心工具入门
在二维科学图表绘制中,Matplotlib 是 Python 生态里最基础也最通用的绘图库,Seaborn 则构建在它之上,用更少代码完成统计类图形。本节围绕四个关键点展开:环境配置、Figure/Axes 图形对象层次、基本绘图流程,以及输出格式与分辨率设置。掌握这四点,后续所有图表绘制都建立在一个可控、可复现的工程基础上。
一、环境配置:把依赖固定下来
推荐使用虚拟环境隔离项目依赖,避免不同项目之间的库版本冲突。以 conda 为例,创建并激活环境后安装核心库:
conda create -n sciplot python=3.11 -y
conda activate sciplot
conda install matplotlib seaborn numpy pandas -y
# 如需导出 PDF 中的矢量字体,可额外确认字体可用性
python -c "import matplotlib; print(matplotlib.__version__)"
安装完成后,建议在脚本开头统一设置后端与字体,避免在无图形界面的服务器上报错,也避免中文标签显示为方块:
import matplotlib
matplotlib.use("Agg") # 无界面环境下保存图片
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei", "DejaVu Sans"]
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
sns.set_theme(style="whitegrid", context="paper")
这里 Agg 后端只负责渲染到文件,不弹窗,适合批量出图;sns.set_theme 一次性统一了网格、字号和配色风格,是 Seaborn 推荐的全局配置入口。
二、Figure 与 Axes:理解图形对象层次
Matplotlib 的对象层次是初学者最容易混淆、也最值得先厘清的部分。最外层是 Figure,它是一张“画布”,负责整体尺寸、分辨率和保存;画布内部可以放置一个或多个 Axes,每个 Axes 才是一个真正带坐标轴、刻度、标题和数据区域的“子图”。此外还有 Axis(单条坐标轴)、Artist(所有可见元素,如线、点、文字、图例)等层级。理解这一点,就能明白为什么“设置标题”要用 ax.set_title(),而“保存整张图”要用 fig.savefig()。
图中可以看到,Figure 是外层容器,两个 Axes 并列排布,各自拥有独立的坐标轴和数据元素。实际编码时,推荐用面向对象写法显式拿到 fig 和 ax,而不是依赖 plt 的隐式当前图:
fig, axes = plt.subplots(1, 2, figsize=(8, 5), dpi=300)
ax1, ax2 = axes
ax1.plot(x, y, color="#e07b39")
ax1.set_title("折线图")
ax2.bar(cats, vals, color="#7cc4b8")
ax2.set_title("柱状图")
fig.tight_layout()
fig.savefig("demo.png", dpi=300, bbox_inches="tight")
三、基本绘图流程
一个可复现的绘图流程通常包含五步:准备数据 → 创建 Figure 与 Axes → 在 Axes 上绘制并设置标签、标题、图例 → 调整布局 → 保存输出。以一组示例数据(非实测,仅用于演示)为例:
import numpy as np
x = np.linspace(0, 10, 50)
y = np.sin(x) * np.exp(-0.1 * x) # 示例数据
fig, ax = plt.subplots(figsize=(6, 4), dpi=150)
ax.plot(x, y, label="衰减正弦", linewidth=2)
ax.set_xlabel("时间 t / s")
ax.set_ylabel("幅值 A")
ax.set_title("示例:衰减振荡曲线")
ax.legend()
ax.grid(alpha=0.3)
fig.tight_layout()
fig.savefig("decay.png", dpi=300, bbox_inches="tight")
运行后应得到一条从 0 附近起振、幅值逐渐衰减的曲线,坐标轴标签与标题齐全,图例位于合适位置。判断是否成功,可以看三点:标签是否完整、曲线形态是否符合预期、保存文件是否生成且尺寸合理。
四、输出格式与分辨率
输出格式直接决定图表用途。PNG 是位图,适合网页、幻灯片和快速预览,但放大会模糊;SVG 是矢量图,适合网页交互和后期编辑,缩放不失真;PDF 是矢量格式,适合论文投稿和印刷,字体嵌入后排版稳定。分辨率用 dpi 控制,屏幕预览 100~150 足够,印刷或投稿通常要求 300 以上。
| 格式 | 类型 | 典型用途 | 注意事项 |
|---|---|---|---|
| PNG | 位图 | 网页、PPT、预览 | 放大模糊,需足够 dpi |
| SVG | 矢量 | 网页、可编辑图形 | 文字转曲或嵌入字体 |
| 矢量 | 论文、印刷 | 注意字体嵌入与页面尺寸 |
dpi 与 bbox_inches="tight",可以避免白边过大;矢量格式下 dpi 主要影响嵌入位图元素,对线条和文字无影响。Agg 即可;子图重叠,用 tight_layout() 或 constrained_layout=True 解决。把环境、对象层次、绘图流程和输出设置四件事一次做对,后续无论是用 Matplotlib 精细控制,还是用 Seaborn 快速出统计图,都能在同一套工程规范下稳定产出可用的二维图表。