Matplotlib(Python)(深度版)
最通用的程序化绘图库,论文配图默认选择
一、一句话定位
最通用的程序化绘图库,论文配图默认选择
二、为什么是它:设计哲学与底层逻辑
Matplotlib 的核心是"面向对象 + 命令式"的绘图范式:一切皆 Artist(Figure/Axes/Line2D/Text),你显式构造对象、调用方法改属性,对图形有像素级控制。它有两种接口——pyplot(stateful 快捷)与 OO(Axes,推荐),后者把"图"建模为可组合的对象树,便于精确排版(多子图对齐、共享轴、注释)。它的哲学是"你写代码 = 你描述图形",因此天然可复现、可版本控制,是论文定稿图的事实标准。代价是默认样式朴素、精细调参有学习成本——但正是这种"显式控制"换来了出版级精度与可复现性。## 三、渲染管线与可复现性推导
渲染管线分三层:①Artist(描述画什么,存于 Figure 对象树);②FigureCanvas(绑定后端,决定输出设备);③Renderer(把 Artist 光栅化/矢量化)。矢量后端(PDF/SVG)输出的是几何指令而非像素:
故放大无损、文字可选。可复现性:脚本即规格,重跑得同图(固定 rcParams 与数据),版本控制 diff 友好——这是"论文重跑一键出图"的底层保障。复杂度代价:精细排版需理解对象层级,学习曲线中等偏陡。## 四、适用场景
- 需要批量、可复现、可随数据自动更新的论文配图
- 画折线/柱状/散点/热力/子图网格等标准图
- 要和 NumPy/Pandas 数据流程无缝衔接
五、优点
- ✅ 免费开源、生态最大(Seaborn/Plotnine 都基于它)
- ✅ 完全程序化,论文重跑一键出图,版本可控
- ✅ 子图、双轴、注释、公式、矢量导出(pdf/svg)全覆盖
- ✅ 社区答案极多,几乎任何图都能找到范例
六、缺点
- ⚠️ 默认样式丑,需要手动调参才好看
- ⚠️ 交互弱, exploratory 分析不如 Plotly
- ⚠️ 复杂排版(多子图对齐)学习曲线陡
七、上手难度
中等
八、典型用途
- 论文所有静态配图
- 数据探索后的定稿图
- 和 Python 代码模板串成自动化出图
九、与谁搭配
搭配 NumPy/Pandas 做数据处理,搭配 Seaborn 快速出统计图,搭配 Plotly 做交互版
十、学习资源
- 官方 gallery(按图搜代码最快)
- 《Python数据可视化模板.py》(本站资料)
- 中文:matplotlib 配色与样式教程
本篇来自《绘图软件横评(深度版)》· 数学建模学习资料站 MCM520
9、实战案例
案例场景:用 Matplotlib 绘制论文常用的柱状图、折线图、散点图。
完整代码
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
# 柱状图:方案评分对比
fig, ax = plt.subplots(figsize=(8, 4))
schemes = ['方案A', '方案B', '方案C', '方案D']
scores = [85.2, 92.1, 78.6, 88.9]
colors = ['#2563eb', '#16a34a', '#f59e0b', '#dc2626']
bars = ax.bar(schemes, scores, color=colors, edgecolor='white')
for bar, score in zip(bars, scores):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,
f'{score:.1f}', ha='center', va='bottom', fontsize=11, fontweight='bold')
ax.set_ylabel('评分', fontsize=12)
ax.set_title('四个方案综合评分对比', fontsize=14, fontweight='bold')
ax.set_ylim(0, 100)
ax.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.savefig('chart.png', dpi=300)
plt.show()
实战案例
Matplotlib 论文绘图实战
场景:论文需 2×2 子图展示四种算法在收敛速度、精度上的对比。
任务:用 Matplotlib 画出版级组合图。
完整代码(python)
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots(2, 2, figsize=(10, 8))
x = np.linspace(0,10,100)
ax[0,0].plot(x, np.sin(x)); ax[0,0].set_title('sin')
ax[0,1].scatter(np.random.rand(50), np.random.rand(50), alpha=.6)
ax[1,0].hist(np.random.randn(1000), 30, edgecolor='k')
ax[1,1].bar(['A','B','C'], [23,45,56], color='steelblue')
for a in ax.ravel(): a.grid(alpha=.3)
plt.tight_layout(); plt.savefig('fig.png', dpi=300)
运行效果
| 子图 | 内容 |
|---|---|
| (0,0) | 折线 sin(x) |
| (0,1) | 散点相关性 |
| (1,0) | 直方图分布 |
| (1,1) | 柱状对比 |
| savefig dpi=300 满足期刊出版要求,tight_layout 防裁切。 |