3. 数据可视化基础:Matplotlib 与 Seaborn 基础图表绘制、统计图形
数据可视化是异常检测与实时监控中不可或缺的环节。通过图形化展示数据分布、趋势与离群点,可以快速定位异常模式。本章聚焦 Python 两大核心可视化库——Matplotlib 与 Seaborn,系统讲解基础图表与统计图形的绘制方法。
学习目标:掌握 Matplotlib 的 Figure 与 Axes 架构;熟练使用 Seaborn 绘制箱线图、直方图、散点图;理解统计图形在异常检测中的典型应用场景。
3.1 Matplotlib 核心架构与基础图表
Matplotlib 采用分层架构,核心概念包括 Figure(画布)、Axes(坐标系)与 Artist(图形元素)。理解这一结构是灵活定制图表的前提。
| 组件 | 说明 | 常用方法 |
|---|---|---|
| Figure | 顶级容器,可包含多个 Axes | plt.figure() |
| Axes | 实际绘图区域,包含坐标轴、刻度、网格 | fig.add_subplot() |
| Axis | 管理刻度位置与标签 | ax.set_xticks() |
| Artist | 所有可见元素(线、点、文本) | ax.plot() |
以下代码展示最基本的折线图绘制流程:
import matplotlib.pyplot as plt
import numpy as np
# 创建 Figure 与 Axes
fig, ax = plt.subplots(figsize=(8, 4))
# 准备数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制折线
ax.plot(x, y, color='#3498db', linewidth=2, label='sin(x)')
# 装饰元素
ax.set_title('正弦曲线', fontsize=14, color='#2c3e50')
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.legend()
ax.grid(True, linestyle='--', alpha=0.6)
plt.tight_layout()
plt.show()
最佳实践:始终使用
fig, ax = plt.subplots() 显式创建 Figure 与 Axes 对象,避免使用 plt.plot() 的隐式模式。这有助于在复杂布局中精确控制每个子图。
3.2 Seaborn 统计图形:箱线图与直方图
Seaborn 基于 Matplotlib 构建,提供更简洁的 API 用于统计图形绘制。在异常检测中,箱线图用于识别离群点,直方图用于观察分布形态。
3.2.1 箱线图(Box Plot)
箱线图通过五数概括(最小值、下四分位数、中位数、上四分位数、最大值)展示数据分布,并将超出 1.5 倍 IQR 的点标记为异常值。
import seaborn as sns
import pandas as pd
import numpy as np
# 生成示例数据
np.random.seed(42)
data = pd.DataFrame({
'类别': ['A']*100 + ['B']*100 + ['C']*100,
'数值': np.concatenate([
np.random.normal(50, 10, 100),
np.random.normal(60, 15, 100),
np.random.normal(45, 8, 100)
])
})
# 绘制箱线图
fig, ax = plt.subplots(figsize=(8, 5))
sns.boxplot(x='类别', y='数值', data=data,
palette=['#3498db', '#2ecc71', '#e74c3c'],
ax=ax)
ax.set_title('三类数据分布箱线图', fontsize=14, color='#2c3e50')
ax.set_ylabel('数值')
plt.tight_layout()
plt.show()
异常检测要点:箱线图标记的离群点(圆圈)对应
Q1 - 1.5*IQR 或 Q3 + 1.5*IQR 之外的数据点。在实时监控中,可据此设定告警阈值。注意:箱线图假设数据近似对称分布,偏态数据需谨慎解读。
3.2.2 直方图(Histogram)
直方图将数据划分为等宽区间(bins),统计每个区间的频数或密度。结合核密度估计(KDE)曲线,可以更平滑地观察分布形状。
# 绘制直方图 + KDE
fig, ax = plt.subplots(figsize=(8, 5))
sns.histplot(data['数值'], bins=30, kde=True,
color='#3498db', edgecolor='white',
alpha=0.7, ax=ax)
ax.set_title('数值分布直方图(含KDE曲线)', fontsize=14, color='#2c3e50')
ax.set_xlabel('数值')
ax.set_ylabel('频数')
plt.tight_layout()
plt.show()
参数调优:
bins 数量影响直方图的分辨率。过少会掩盖细节,过多则引入噪声。建议使用 sns.histplot(bins='auto') 让 Seaborn 自动选择最优 bin 数,或基于 Freedman-Diaconis 规则手动设定。
3.3 散点图与相关性分析
散点图用于展示两个连续变量之间的关系。在异常检测中,散点图可以直观发现偏离主趋势的离群点。
# 生成带异常点的二维数据
np.random.seed(42)
x = np.random.normal(0, 1, 200)
y = 2 * x + np.random.normal(0, 0.5, 200)
# 注入异常点
x_out = np.array([3.5, -3.0, 4.0, -3.8])
y_out = np.array([10, -7, 12, -9])
x = np.concatenate([x, x_out])
y = np.concatenate([y, y_out])
# 绘制散点图
fig, ax = plt.subplots(figsize=(8, 6))
sns.scatterplot(x=x, y=y, color='#3498db', s=50, alpha=0.7, ax=ax)
# 高亮异常点
sns.scatterplot(x=x_out, y=y_out, color='#e74c3c', s=100,
marker='X', edgecolor='#c0392b', ax=ax)
ax.set_title('散点图:正常点与异常点对比', fontsize=14, color='#2c3e50')
ax.set_xlabel('特征 X')
ax.set_ylabel('特征 Y')
ax.legend(['正常点', '异常点'])
plt.tight_layout()
plt.show()
3.4 图表组合与子图布局
在监控大屏中,常需要将多个图表组合展示。Matplotlib 的 subplots 与 GridSpec 支持灵活的子图布局。
# 创建 2×2 子图布局
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 左上:箱线图
sns.boxplot(x='类别', y='数值', data=data, ax=axes[0,0])
axes[0,0].set_title('箱线图')
# 右上:直方图
sns.histplot(data['数值'], bins=30, kde=True, ax=axes[0,1])
axes[0,1].set_title('直方图 + KDE')
# 左下:散点图
sns.scatterplot(x=x, y=y, ax=axes[1,0])
axes[1,0].set_title('散点图')
# 右下:密度图
sns.kdeplot(x=data['数值'], fill=True, ax=axes[1,1])
axes[1,1].set_title('核密度估计')
plt.tight_layout()
plt.show()
监控大屏集成要点:
• 使用
• 统一配色方案,避免视觉混乱。推荐使用 Seaborn 的
• 为每个子图添加标题与轴标签,便于快速解读。
• 异常检测场景中,箱线图与散点图应优先放置在显眼位置。
• 使用
figsize 控制整体尺寸,确保在大屏上清晰显示。• 统一配色方案,避免视觉混乱。推荐使用 Seaborn 的
set_palette() 全局设置。• 为每个子图添加标题与轴标签,便于快速解读。
• 异常检测场景中,箱线图与散点图应优先放置在显眼位置。
3.5 本章小结
| 图形类型 | 核心用途 | 异常检测应用 | 推荐库 |
|---|---|---|---|
| 箱线图 | 展示数据分布与离群点 | 识别单变量异常值 | Seaborn |
| 直方图 | 观察数据分布形态 | 检测分布偏移、多峰分布 | Seaborn / Matplotlib |
| 散点图 | 展示两变量关系 | 发现偏离主趋势的离群点 | Seaborn / Matplotlib |
| 核密度图 | 平滑估计概率密度 | 对比不同组别的分布差异 | Seaborn |
掌握这些基础图形后,下一阶段将进入异常检测算法的实战应用。建议读者在本地环境中运行本章所有代码示例,并尝试调整参数观察图形变化,加深对数据分布与异常模式的理解。