Matplotlib 速查手册

0. 🚀 最简画图(一分钟启动)

适用场景:刚进 Jupyter,不想记任何复杂参数,只想立刻画个图看看数据长什么样。

 1import matplotlib.pyplot as plt
 2
 3# === 1. 准备最简单的一串数据 ===
 4x = [1, 2, 3, 4, 5]
 5y = [2, 4, 1, 5, 3]
 6
 7# === 2. 画图:核心 plot 方法(同时控制 点、线、颜色) ===
 8# marker='o'  -> 画空心圆点
 9# linestyle='--' -> 画虚线(两个减号)
10# color='r'   -> 红色 (r=red, b=blue, g=green, k=black)
11# markersize=8 -> 点的大小
12plt.plot(x, y, marker='o', linestyle='--', color='r', markersize=8)
13
14# === 3. 控制横竖坐标的显示范围 ===
15plt.xlim(0, 6)  # X轴显示 0 到 6
16plt.ylim(0, 6)  # Y轴显示 0 到 6
17
18# === 4. 控制横竖坐标的刻度(显示哪些数字) ===
19plt.xticks([1, 2, 3, 4, 5])   # X轴上只显示 1,2,3,4,5
20plt.yticks([0, 2, 4, 6])      # Y轴上只显示 0,2,4,6
21
22# === 5. 展示图形 ===
23plt.show()

🎯 核心参数速查(最简版)

你要控制什么 写在哪里 常用选项(敲黑板)
画点 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 用于生成示例数据。

1import matplotlib.pyplot as plt
2import numpy as np
3
4# 生成示例数据:0到10之间的100个点
5x = np.linspace(0, 10, 100)
6y = np.sin(x)

📈 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')

✨ 补充说明:几个重点图表的绘图细节

  1. 箱线图 (Boxplot) 进阶用法

    • 它能直接显示最小值、Q1、中位数、Q3、最大值,远离箱体的点即为离群值。
    • 在对比多个特征时,搭配 plt.xticks() 可以轻松改名:
    1data_to_plot = [df['age'], df['income'], df['score']]
    2plt.boxplot(data_to_plot, labels=['年龄', '收入', '评分'])
    3plt.title('特征离群值分析')
    4plt.show()
  2. 热力图 (Heatmap) 在 ML 中的标配

    • 用于查看特征间多重共线性。通常搭配 numpy 计算相关系数:
    1import numpy as np
    2corr = np.corrcoef(df[['特征1','特征2','特征3']].T)
    3plt.imshow(corr, cmap='RdBu_r', vmin=-1, vmax=1)
    4plt.colorbar()  # 别忘了加颜色条
    5plt.xticks(range(3), ['特征1','特征2','特征3'])
    6plt.yticks(range(3), ['特征1','特征2','特征3'])
  3. 小提琴图 (Violinplot) 的优势

    • 相比箱线图,它能捕捉到数据的双峰或多峰分布,特别适合分析非正态分布的梯度或损失值。
  4. 误差棒图 (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 先搞懂两个核心对象:figaxs

当执行 fig, axs = plt.subplots(2, 2) 时,干了两件事:

变量 类型 通俗理解 作用
fig Figure 对象 画板(画布) 整个图形的大窗口。用来设置整体尺寸(figsize)、大标题(suptitle)、保存图片(savefig)。
axs Axes 对象(或数组) 画板上的多个“小坐标纸” 每个小坐标纸就是一个独立的绘图区域。所有绘图命令(如 plotscatterset_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)

 1import matplotlib.pyplot as plt
 2import numpy as np
 3
 4# 1. 创建一个 2行 x 2列 的子图布局,并设置画布大小为 10x6 英寸
 5fig, axs = plt.subplots(2, 2, figsize=(10, 6))
 6
 7# 此时 axs 是一个二维数组,结构如下:
 8# axs[0, 0]  axs[0, 1]
 9# axs[1, 0]  axs[1, 1]
10
11# 2. 在指定位置绘图(必须指明在哪个坐标系上画)
12x = np.linspace(0, 10, 50)
13axs[0, 0].plot(x, np.sin(x), color='red')          # 第一行第一列
14axs[0, 1].scatter(x, np.cos(x), color='blue')      # 第一行第二列
15axs[1, 0].plot(x, np.tan(x), color='green')        # 第二行第一列
16axs[1, 1].plot(x, np.exp(x/5), color='purple')     # 第二行第二列
17
18# 3. 分别定制每个小图的标题和标签(避免混乱)
19axs[0, 0].set_title("正弦波")
20axs[0, 0].set_xlabel("时间")
21axs[0, 0].set_ylabel("振幅")
22
23axs[1, 1].set_title("指数增长")
24axs[1, 1].set_xlabel("迭代次数")
25
26# 4. 给整个大画板添加总标题
27fig.suptitle("2x2 子图综合示例", fontsize=16)
28
29# 5. 自动防止标签重叠(强烈建议加上)
30plt.tight_layout()
31plt.show()

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.flataxs.flatten() 将二维数组展平,防止写晕下标。

1# 假设是 3x3 的网格,想一次性全部画满
2fig, axs = plt.subplots(3, 3, figsize=(12, 12))
3for i, ax in enumerate(axs.flat):  # flat 将 9 个坐标依次取出
4    ax.plot(x, np.sin(x + i))       # 每个子图画一条相位不同的正弦波
5    ax.set_title(f"子图 {i+1}")
6plt.tight_layout()
7plt.show()

4.4 机器学习专属参数:sharexsharey(省纸神器)

在对比模型效果或不同特征的分布时,希望多个子图共用同一个X轴或Y轴,这样能直观对比且节省空间。

 1# sharex=True 表示:所有子图共享 X 轴的刻度和范围(只需最下面一行显示刻度即可)
 2# sharey=True 表示:所有子图共享 Y 轴的刻度和范围(只需最左边一列显示刻度即可)
 3fig, axs = plt.subplots(2, 2, figsize=(10, 8), sharex=True, sharey=True)
 4
 5# 模拟四个不同噪声水平的数据分布
 6data1 = np.random.normal(0, 1, 1000)
 7data2 = np.random.normal(1, 1.5, 1000)
 8data3 = np.random.normal(-1, 0.8, 1000)
 9data4 = np.random.normal(2, 1.2, 1000)
10
11axs[0, 0].hist(data1, bins=30, alpha=0.7)
12axs[0, 1].hist(data2, bins=30, alpha=0.7)
13axs[1, 0].hist(data3, bins=30, alpha=0.7)
14axs[1, 1].hist(data4, bins=30, alpha=0.7)
15
16# 由于 sharex=True,只需要设置最下面一行子图的 X 轴标签
17axs[1, 0].set_xlabel("特征值")
18axs[1, 1].set_xlabel("特征值")
19# 由于 sharey=True,只需要设置最左边一列子图的 Y 轴标签
20axs[0, 0].set_ylabel("频数")
21axs[1, 0].set_ylabel("频数")
22
23fig.suptitle("不同噪声水平下特征分布对比", fontsize=14)
24plt.tight_layout()
25plt.show()

4.5 进阶技巧:不规则布局(大图套小图)

机器学习中,有时想在一张图中,左边占大面积显示主图,右边堆叠两个小图显示细节。这时可以用 gridspecsubplot_mosaic(推荐新写法):

 1# 使用 mosaic 描述布局(语法直观易懂)
 2fig, axs = plt.subplot_mosaic([
 3    ['主图', '右上'],
 4    ['主图', '右下']
 5], figsize=(8, 6))
 6
 7# 绘图(直接通过字符串名称索引)
 8axs['主图'].plot(x, np.sin(x), label='主趋势', color='k')
 9axs['主图'].set_title('主图:整体走势')
10axs['右上'].scatter(x[:20], np.cos(x[:20]), color='r')
11axs['右上'].set_title('右上:局部散点')
12axs['右下'].hist(np.random.randn(500), bins=20)
13axs['右下'].set_title('右下:残差分布')
14
15plt.tight_layout()
16plt.show()

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 内置了多种专业样式,一行代码即可改变图表外观。

1# 应用 'ggplot' 样式,模仿R语言的ggplot2风格
2plt.style.use('ggplot')
3
4# 或者应用 'seaborn-v0_8-whitegrid' 样式
5plt.style.use('seaborn-v0_8-whitegrid')

📊 展示模型性能:绘制学习曲线

通过绘制模型在训练集和验证集上的性能随训练集大小变化的曲线,可以诊断模型是否存在过拟合或欠拟合。

 1# 假设 train_scores 和 val_scores 是已计算好的分数列表
 2train_scores = [0.6, 0.7, 0.8, 0.85]
 3val_scores = [0.5, 0.65, 0.7, 0.72]
 4train_sizes = [100, 200, 300, 400]
 5
 6plt.plot(train_sizes, train_scores, 'o-', label='训练集')
 7plt.plot(train_sizes, val_scores, 'o-', label='验证集')
 8plt.xlabel('训练集大小')
 9plt.ylabel('模型得分')
10plt.title('学习曲线')
11plt.legend()
12plt.grid(True)
13plt.show()

🎯 可视化模型决策边界

对于分类器(如KNN、SVM),可以在特征空间的二维平面上可视化其决策边界,直观理解模型的分类逻辑。这通常需要借助 numpy 生成网格点,并用 contourfpcolormesh 绘制。

🧰 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() 添加颜色条是必须的。