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() 的隐式模式。这有助于在复杂布局中精确控制每个子图。
Matplotlib 分层架构 Figure(画布) Axes(坐标系) Axis(坐标轴) Artist(图形元素) 可包含多个 Axes 支持子图布局

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 之外的数据点。在实时监控中,可据此设定告警阈值。注意:箱线图假设数据近似对称分布,偏态数据需谨慎解读。
箱线图结构说明 上边缘(最大值) 中位数(Q2) 下边缘(最小值) 异常值 IQR = Q3 - Q1 箱体高度 = 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()
散点图异常检测示意 特征 X 特征 Y 蓝色:正常点 红色:异常点 绿色虚线:线性趋势

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()
监控大屏集成要点:
• 使用 figsize 控制整体尺寸,确保在大屏上清晰显示。
• 统一配色方案,避免视觉混乱。推荐使用 Seaborn 的 set_palette() 全局设置。
• 为每个子图添加标题与轴标签,便于快速解读。
• 异常检测场景中,箱线图与散点图应优先放置在显眼位置。

3.5 本章小结

图形类型 核心用途 异常检测应用 推荐库
箱线图 展示数据分布与离群点 识别单变量异常值 Seaborn
直方图 观察数据分布形态 检测分布偏移、多峰分布 Seaborn / Matplotlib
散点图 展示两变量关系 发现偏离主趋势的离群点 Seaborn / Matplotlib
核密度图 平滑估计概率密度 对比不同组别的分布差异 Seaborn

掌握这些基础图形后,下一阶段将进入异常检测算法的实战应用。建议读者在本地环境中运行本章所有代码示例,并尝试调整参数观察图形变化,加深对数据分布与异常模式的理解。