在 AI 与数据科学流程中,“一图胜千言”。纯粹的数据表格和张量很难让人一眼看出规律,而数据可视化 (Data Visualization) 是模型开发全生命周期不可或缺的“后视镜”与“仪表盘”:
在编写 Python 绘图代码时,必须理解 Matplotlib 的底层层级架构。 Matplotlib 存在两种绘图 API 风格:
plt.plot()):类似于 MATLAB 风格,依赖当前状态机,简单但面对多子图排版时极其容易混淆。fig, ax = plt.subplots()):显式创建画布和子图对象,结构清晰,是 AI 工业界的标准推荐范式。Figure (画布):最外层的容器,容纳所有的 Axes、全局标题 (suptitle)、图例和颜色条。Axes (子图/坐标系):真正承载具体图表的图像区域,拥有独立的 X/Y 轴 (Axis)、刻度 (Ticks)、标题和绘制图形。Axis (坐标轴):负责刻度线、刻度标签以及网格线的生成与样式。支持常用 AI 图形切变与实时全量参数调优
点击放大查看图:Matplotlib 面向对象 Figure 与 Axes 层次结构拆解
在 AI 建模全流程中,有 5 种最高频使用的图表类型。下面逐一讲解其绘制技巧与应用场景。
折线图是观察连续时间序列或 Epoch 演化过程的首选。在深度学习或机器学习训练中,我们将 Train Loss 和 Val Loss 同屏绘制,以诊断过拟合点。
散点图用于展示两个连续变量之间的映射关系。在分类问题中,我们可以用点的色彩区分不同类别 (Labels),直观判断特征的可分性 (Separability)。
机器学习模型(如线性回归、神经网络)通常对特征的分布形态极为敏感。通过直方图 (Histogram) 结合核密度估计 (KDE, Kernel Density Estimation),可以检测特征数据是否存在偏态 (Skewness) 或异常极大/极小值 (Outliers)。
在后续【阶段 1 机器学习】分类算法中,我们将使用混淆矩阵评估模型的预测对错。在 Python 阶段,我们重点掌握如何使用 sns.heatmap() 将二维矩阵转化为直观的热力图!
点击放大查看图:混淆矩阵热力图示例
sns.heatmap)在本地 IDE、Jupyter Notebook 或服务器 Python 环境中,推荐直接使用 Seaborn 官方极其优雅的 sns.heatmap() 实现混淆矩阵可视化:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 1. 模拟 3 分类模型的混淆矩阵 (True Labels vs Predicted Labels)
conf_matrix = np.array([
[45, 3, 2], # 类别 0 实际有 50 个样本
[ 4, 42, 4], # 类别 1 实际有 50 个样本
[ 1, 6, 43] # 类别 2 实际有 50 个样本
])
class_names = ["Setosa", "Versicolor", "Virginica"]
fig, ax = plt.subplots(figsize=(6, 5))
# 2. 使用 Seaborn 一键绘制带数值标注的热力图
sns.heatmap(
conf_matrix,
annot=True, # 显示单元格具体数值
fmt='d', # 整数格式
cmap='Blues', # 渐变蓝色调
xticklabels=class_names,
yticklabels=class_names,
cbar=True,
ax=ax
)
ax.set_title("Confusion Matrix Heatmap (Seaborn Standard)", fontsize=12, fontweight="bold")
ax.set_xlabel("Predicted Label", fontsize=10)
ax.set_ylabel("True Label", fontsize=10)
plt.tight_layout()
plt.show()
print("Seaborn 混淆矩阵绘制完毕:主对角线数值越高代表预测越准确。")
当数据集包含 3~6 个连续数值特征时,手动逐个画散点图效率极低。Pandas 内置的 pd.plotting.scatter_matrix() 能够一键生成特征矩阵对角线(单特征分布/KDE 密度)与非对角线(两两特征相关性散点图)的全景图,且完全基于 Matplotlib 原生渲染,在浏览器端可 100% 顺畅执行!
在本地 IDE、Jupyter Notebook 或服务器 Python 环境中(已安装 seaborn 和 scipy),可以直接使用工业级的高阶可视化 API:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# --- A. Pearson 皮尔逊相关系数矩阵 (Pearson Correlation Matrix) ---
np.random.seed(42)
df_features = pd.DataFrame({
'Petal_Length': np.random.normal(5, 1, 100),
'Petal_Width': np.random.normal(2, 0.5, 100),
'Sepal_Length': np.random.normal(6, 1, 100),
'Sepal_Width': np.random.normal(3, 0.5, 100)
})
# 计算特征间两两 Pearson 相关系数矩阵 (-1 ~ +1)
pearson_corr = df_features.corr(method='pearson')
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
# 绘制 Pearson 相关系数热力图 (使用极性发散色盘)
sns.heatmap(
pearson_corr,
annot=True, # 显示皮尔逊相关系数值 (r)
fmt='.2f', # 保留 2 位小数
cmap='vlag', # 极性发散色盘 (正相关红/负相关蓝)
vmin=-1, vmax=1,
square=True,
cbar_kws={'label': 'Pearson Correlation (r)'},
ax=ax1
)
ax1.set_title("Pearson Correlation Matrix Heatmap", fontsize=12, fontweight='bold')
# --- B. Seaborn 3 分类混淆矩阵热力图 ---
conf_matrix = np.array([
[45, 3, 2],
[ 4, 42, 4],
[ 1, 6, 43]
])
class_names = ["Setosa", "Versicolor", "Virginica"]
sns.heatmap(
conf_matrix,
annot=True, # 填入具体分类样本数
fmt='d',
cmap='Blues',
xticklabels=class_names,
yticklabels=class_names,
cbar=True,
ax=ax2
)
ax2.set_title("Confusion Matrix Heatmap (Seaborn)", fontsize=12, fontweight='bold')
ax2.set_xlabel("Predicted Label")
ax2.set_ylabel("True Label")
plt.tight_layout()
plt.show()
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 构建包含类别标签的数据集
np.random.seed(0)
n = 100
df_iris = pd.DataFrame({
'Petal_Length': np.random.normal(5, 1.5, n),
'Petal_Width': np.random.normal(2, 0.5, n),
'Sepal_Length': np.random.normal(6, 1.2, n),
'Species': np.random.choice(['Setosa', 'Versicolor'], size=n)
})
# 本地 Seaborn 一键生成对角线 KDE 密度 + 非对角线按类别着色的散点全景图
grid = sns.pairplot(
df_iris,
hue='Species', # 按花卉类别颜色区分
palette='Set1', # 经典高对比调色盘
corner=True, # 隐藏右上角重复的对称三角区
diag_kind='kde' # 对角线使用核密度估计 (KDE)
)
grid.fig.suptitle("Seaborn Pairplot Feature Distributions", y=1.02, fontsize=12, fontweight='bold')
plt.show()
生产环境或学术论文中的图表,需要遵循严谨的视觉排版规范。
点击放大查看图:AI 数据可视化美化排版与配色规范
Matplotlib 默认不支持中文字体,直接输出中文会导致方框乱码 □□,负号 - 也可能显示为异常字符。需进行如下全局配置:
import matplotlib.pyplot as plt
# 1. 指定默认中文字体 (Windows 常用 SimHei / Microsoft YaHei, Mac 常用 Arial Unicode MS / PingFang SC)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
# 2. 解决保存图像时负号 '-' 显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
| 属性配置 | 推荐 API | 最佳实践说明 |
|---|---|---|
| 画布尺寸与 DPI | plt.subplots(figsize=(8,5), dpi=150) | figsize 控制宽高比,dpi 设为 150~300 保证清晰度 |
| 坐标轴标签 | ax.set_xlabel("Epoch", fontsize=11) | 必须明确标注变量物理含义与单位 |
| 标题 | ax.set_title("Loss Trend", fontweight='bold') | 简洁总结图表传递的核心观点 |
| 网格线 | ax.grid(True, linestyle='--', alpha=0.5) | 使用半透明虚线,避免遮挡数据线条 |
| 图例 Legend | ax.legend(loc='upper right', frameon=True) | loc='best' 自动防遮挡,开启边框提升可读性 |
viridis, YlGnBu —— 用于体现数值渐变(如 Loss 大小)。coolwarm, RdBu —— 用于体现以 0 为中心的正负离差(如 Pearson 相关系数 -1 到 +1)。Set2, tab10 —— 用于无序的分组类别区分。plt.savefig("loss.png") 导出的图片文件全是空白一片。plt.savefig() 之前 执行了 plt.show(),plt.show() 在渲染展示完后会自动清空并销毁当前 Figure 画布内存。plt.show() 之前 调用 plt.savefig("loss.png", bbox_inches='tight')。本章系统掌握了基于 Matplotlib 与 Seaborn 的 AI 数据可视化体系:
Figure 与 Axes 的面向对象架构,放弃了不易维护的隐式 plt 全局作图。plt.savefig() 清空避坑法则。heatmap 进行热力图渲染,能够清晰展现 LLM 在生成某个 Token 时关注了上下文哪些词汇。| 错误现象 / 异常类型 | 常见原因 | 解决方案 |
|---|---|---|
plt.savefig() 导出的图片完全空白 | 在调用 plt.savefig() 之前先执行了 plt.show(),画布内容在 show 后被自动清空销毁 | 调整代码顺序,确保在 plt.savefig("loss.png", bbox_inches='tight') 之后 再执行 plt.show() |
| 图表中文字符显示为小方框 / 乱码 | Matplotlib 默认缺失中文字体映射 | 配置全局字体:plt.rcParams['font.sans-serif'] = ['SimHei'](Windows)或 ['Arial Unicode MS'](macOS),并设置 plt.rcParams['axes.unicode_minus'] = False |
| X 轴坐标刻度标签互相重叠遮挡 | 刻度标签文本较长或数量过于密集 | 使用 plt.xticks(rotation=45) 旋转标签角度,或调大 figsize、调用 plt.tight_layout() 自动调整外边距 |
| Seaborn 绘图不显示或没有弹出窗口 | 在 Python .py 纯脚本执行时未调用 plt.show() | Seaborn 基于 Matplotlib 构建,在非 Notebook 交互式环境中绘图后必须显式调用 plt.show() 才能渲染窗口 |
Figure 与 Axes 的层级拆解与显式 fig, ax = plt.subplots() 作图范式。pairplot 快速对多维特征空间进行两两散点与分布全景审查。plt.savefig() 与 plt.show() 的清空顺序陷阱。fig, axes = plt.subplots(2, 2),返回的 axes 变量是什么数据结构?如何选中右上角的子图进行作图?Axes 上绘制标准正态分布与双峰混合正态分布的 KDE 密度曲线,设置不同的颜色、虚线样式,并添加文字标注 (annotate) 指出极值点。进入下一个专项 11. AI 数据与实验工作流规范,掌握数据集划分、特征缩放与防数据泄露工程规范。