Matplotlib 速查手册
0. 🚀 最简画图(一分钟启动)
适用场景:刚进 Jupyter,不想记任何复杂参数,只想立刻画个图看看数据长什么样。
🎯 核心参数速查(最简版)
| 你要控制什么 | 写在哪里 | 常用选项(敲黑板) |
|---|---|---|
| 画点 | marker= |
'o'(圆)、'^'(三角)、'*'(星号)、's'(方块) |
| 画线 | linestyle= |
'-'(实线)、'--'(虚线)、':'(点线) |
| 改颜色 | color= |
'r'(红)、'b'(蓝)、'g'(绿)、'k'(黑)、'#FF0000'(自定义) |
| 横坐标范围 | plt.xlim(起点, 终点) |
例:plt.xlim(-1, 10) |
| 纵坐标范围 | plt.ylim(起点, 终点) |
例:plt.ylim(0, 1) |
| 横坐标刻度 | plt.xticks([列表]) |
例:plt.xticks([0, 5, 10]) |
| 纵坐标刻度 | plt.yticks([列表]) |
例:plt.yticks([-1, 0, 1]) |
💡 动手试试:把上面代码中的
linestyle='--'改成linestyle='-',或者把color='r'改成color='b',运行看看效果,这就是 Matplotlib 最底层的操作逻辑!
📚 1. 准备工作:导入与数据
在开始任何绘图之前,需要先导入 Matplotlib 的核心库 pyplot,通常也会导入 numpy 用于生成示例数据。
📈 2. 核心图表类型速查(机器学习增强版)
| 应用场景 | 图表类型 | 函数 | 核心用途(机器学习场景) | 代码示例 |
|---|---|---|---|---|
| 📉 趋势与收敛 | 折线图 | plt.plot() |
绘制 Loss 曲线、Accuracy 曲线、学习率变化,监控模型是否收敛。 | plt.plot(epochs, train_loss, label='训练损失') |
| 面积图(填充图) | plt.fill_between() |
填充置信区间,常用于展示训练/验证曲线周围的标准差带。 | plt.fill_between(x, y-std, y+std, alpha=0.3) |
|
| 📊 分布与离群值检测 | 直方图 | plt.hist() |
查看单个特征的数值分布(是否服从正态分布),帮助决定是否做标准化。 | plt.hist(df['age'], bins=30, edgecolor='black') |
| 箱线图 ⭐ | plt.boxplot() |
检测异常值、对比多个特征的分布范围(中位数、四分位距)。 | plt.boxplot([df[c] for c in ['特征A','特征B']]) |
|
| 小提琴图 | plt.violinplot() |
箱线图的增强版,叠加了KDE核密度估计,能看清数据的“峰”和“尾”形态。 | plt.violinplot(dataset, positions=[1,2,3]) |
|
| 🔍 关系与相关性 | 散点图 | plt.scatter() |
观察两个特征间的线性/非线性关系,或使用 c=label 参数可视化聚类效果。 |
plt.scatter(X[:,0], X[:,1], c=y_pred, cmap='coolwarm') |
| 热力图 ⭐ | plt.imshow() 或 matshow() |
可视化特征相关性矩阵(Correlation Matrix)和混淆矩阵(Confusion Matrix)。 | plt.imshow(corr_matrix, cmap='Blues', aspect='auto') |
|
| 🏆 比较与重要性 | 柱状图 | plt.bar() |
对比不同类别的数量,或展示特征重要性排序(Feature Importance)。 | plt.barh(feature_names, importance_scores)(水平更清晰) |
| 饼图 | plt.pie() |
展示数据集的类别占比(⚠️ 类别多时慎用,易看不清)。 | plt.pie(class_counts, labels=['猫','狗']) |
|
| 🎯 模型性能评估 | 误差棒图 ⭐ | plt.errorbar() |
展示多次实验的平均准确率 ± 标准差,直观体现模型的稳定性。 | plt.errorbar(model_names, mean_acc, yerr=std_acc, fmt='o') |
✨ 补充说明:几个重点图表的绘图细节
-
箱线图 (Boxplot) 进阶用法
- 它能直接显示最小值、Q1、中位数、Q3、最大值,远离箱体的点即为离群值。
- 在对比多个特征时,搭配
plt.xticks()可以轻松改名:
-
热力图 (Heatmap) 在 ML 中的标配
- 用于查看特征间多重共线性。通常搭配
numpy计算相关系数:
- 用于查看特征间多重共线性。通常搭配
-
小提琴图 (Violinplot) 的优势
- 相比箱线图,它能捕捉到数据的双峰或多峰分布,特别适合分析非正态分布的梯度或损失值。
-
误差棒图 (Errorbar)
- 在论文或课程报告中展示 K-Fold 交叉验证结果时非常实用,能让结果看起来更严谨。
🎨 3. 图表个性化定制
掌握这些定制选项,能让你的图表更清晰、更专业。
| 定制项 | 代码示例 | 说明 |
|---|---|---|
| 标题 | plt.title("正弦波") |
为图表添加标题。 |
| 坐标轴标签 | plt.xlabel("X轴"), plt.ylabel("Y轴") |
为X轴和Y轴添加标签。 |
| 网格线 | plt.grid(True) |
显示网格线,便于数据读取。 |
| 图例 | plt.legend(["线条1"]) |
标识不同数据系列。 |
| 坐标轴范围 | plt.xlim(0, 10), plt.ylim(-1, 1) |
手动设置坐标轴的显示范围。 |
| 刻度标签 | plt.xticks([0, 5, 10]), plt.yticks([-1, 0, 1]) |
自定义刻度位置和标签。 |
| 线条样式 | plt.plot(x, y, linestyle='--') |
设置线条为虚线。 |
| 颜色 | plt.plot(x, y, color='green') |
设置线条颜色。 |
| 标记点 | plt.plot(x, y, marker='o') |
在数据点上显示标记。 |
| 文本注释 | plt.text(5, 0, "中点") |
在指定坐标添加文本。 |
| 指向性注释 | plt.annotate("波峰", xy=(7, 1), xytext=(6, 1.5), arrowprops=dict(arrowstyle="->")) |
添加带箭头的注释。 |
🏗️ 4. 高级布局:子图(Subplots)深度详解
核心认知转变:从现在开始,忘掉
plt.plot()这种“自动画在最后一张图”的模式。在子图布局中,使用 “面向对象” 接口——明确告诉程序“在哪个坐标轴(Axes)上画什么”。
4.1 先搞懂两个核心对象:fig 和 axs
当执行 fig, axs = plt.subplots(2, 2) 时,干了两件事:
| 变量 | 类型 | 通俗理解 | 作用 |
|---|---|---|---|
fig |
Figure 对象 |
画板(画布) | 整个图形的大窗口。用来设置整体尺寸(figsize)、大标题(suptitle)、保存图片(savefig)。 |
axs |
Axes 对象(或数组) |
画板上的多个“小坐标纸” | 每个小坐标纸就是一个独立的绘图区域。所有绘图命令(如 plot、scatter、set_xlabel)都挂在它下面。 |
⚠️ 关键陷阱:
axs的格式取决于(行, 列)的数量:
(1, 1)→axs是一个单独的Axes对象。(1, N)或(N, 1)→axs是一个一维数组(列表)。(N, M)且 N>1 且 M>1 →axs是一个二维数组(矩阵)。
4.2 拆解 fig, axs = plt.subplots(2, 2)
4.3 最常搞混的三种索引场景(必看!)
由于 axs 可能是对象、一维数组或二维数组,遍历它们的方式完全不同:
| 布局写法 | axs 的类型 |
正确的遍历/索引方式 |
|---|---|---|
fig, ax = plt.subplots() |
单个 Axes 对象 |
直接使用 ax.plot(...) |
fig, axs = plt.subplots(1, 3) |
一维数组(长度3) | axs[0], axs[1], axs[2] 或 for ax in axs: |
fig, axs = plt.subplots(2, 3) |
二维数组(2行3列) | axs[0, 1](第0行第1列)或 for ax in axs.flat:(展平为1维遍历) |
💡 机器学习最佳实践:当子图数量较多时,强烈推荐使用
axs.flat或axs.flatten()将二维数组展平,防止写晕下标。
4.4 机器学习专属参数:sharex 和 sharey(省纸神器)
在对比模型效果或不同特征的分布时,希望多个子图共用同一个X轴或Y轴,这样能直观对比且节省空间。
4.5 进阶技巧:不规则布局(大图套小图)
机器学习中,有时想在一张图中,左边占大面积显示主图,右边堆叠两个小图显示细节。这时可以用 gridspec 或 subplot_mosaic(推荐新写法):
4.6 子图终极操作清单
| 需求 | 代码写法 |
|---|---|
| 创建 3 个并排的小图 | fig, axs = plt.subplots(1, 3, figsize=(15, 4)) |
| 创建 2 行,但上下不共享X轴 | fig, axs = plt.subplots(2, 1, sharex=False) |
| 设置整个画布的背景色 | fig.patch.set_facecolor('lightgray') |
| 删除某个子图(比如第二行第一列) | fig.delaxes(axs[1, 0]) |
| 调整子图之间的间距(手动微调) | plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1, wspace=0.3, hspace=0.3) |
| 保存含有多个子图的大图 | fig.savefig('my_grid.png', dpi=300, bbox_inches='tight') |
🤖 5. 机器学习专属可视化技巧
✨ 瞬间提升图表质感:使用样式表
Matplotlib 内置了多种专业样式,一行代码即可改变图表外观。
📊 展示模型性能:绘制学习曲线
通过绘制模型在训练集和验证集上的性能随训练集大小变化的曲线,可以诊断模型是否存在过拟合或欠拟合。
🎯 可视化模型决策边界
对于分类器(如KNN、SVM),可以在特征空间的二维平面上可视化其决策边界,直观理解模型的分类逻辑。这通常需要借助 numpy 生成网格点,并用 contourf 或 pcolormesh 绘制。
🧰 6. 速查参数表
| 常用参数 | 选项/说明 | 使用场景 |
|---|---|---|
marker |
'o' (圆), '^' (三角), 's' (方块), '*' (星) |
区分不同类别的数据点 |
linestyle |
'-' (实线), '--' (虚线), '-.' (点划线), ':' (点线) |
区分不同数据系列的线条 |
color / c |
颜色名称 ('red'), 简写 ('r'), 十六进制 ('#FF0000') |
自定义颜色 |
alpha |
0 (完全透明) 到 1 (完全不透明) |
处理重叠点较多的散点图 |
cmap |
'viridis', 'plasma', 'coolwarm' 等 |
为散点图或热力图添加颜色映射 |
bins |
整数或序列 | 控制直方图的组距 |
💡 7. 小贴士
- 探索样式:可以在代码中尝试
plt.style.available查看所有可用的内置样式。 - 面向对象接口:除了
plt函数,更推荐使用面向对象的方式fig, ax = plt.subplots(),然后通过ax.plot()等方法进行绘制,这在处理复杂图表时更加清晰和强大。 - 善用Colorbar:在散点图或热力图中,当用颜色表示第三维数据时,使用
plt.colorbar()添加颜色条是必须的。