章节导语

“一张图胜过千言万语。如果你的老板没时间看你的Python代码,也没耐心读几千行的Excel数据,那就甩给他一张图表。”

在AI领域,可视化不仅仅是为了“好看”,更是为了“诊断”。数据科学家就像医生,图表就是X光片。通过可视化,我们可以一眼看出数据分布是否正常、特征之间是否有关系、模型训练是否过拟合。

在Python的世界里,有两个名字如雷贯耳:MatplotlibSeaborn

  • Matplotlib 是老牌的底层绘图库,它像是一套专业的“绘图工具箱”,给你纸笔和尺子,你想怎么画都行,但需要你对每一个线条有精准的控制。

  • Seaborn 则是基于Matplotlib构建的高级库,它更像是一个“美颜相机”或“滤镜”,只需要一行代码,就能生成配色优雅、符合统计学审美的图表。

本章我们将从零开始,掌握这两大神器,让枯燥的数据在屏幕上跳舞。


3.1 学习目标

在学完本章后,你将能够:

  1. 掌握绘图解剖学:理解Figure(画布)与Axes(坐标系)的区别。

  2. 解决痛点:彻底搞定Matplotlib中文显示乱码的“顽疾”。

  3. 美学升级:熟练使用Seaborn绘制直方图、散点图和箱线图。

  4. AI工程思维:学会使用热力图(Heatmap)筛选特征,这是机器学习前的必修课。

  5. 实战落地:通过一个“员工离职分析”案例,用图表挖掘数据背后的秘密。


3.2 Matplotlib:绘制你的第一张图

首先,我们需要引入这两个库。按照国际惯例,别名如下:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
​
# --- 【小白避坑】中文乱码终极解决方案 ---
# 很多教程没提这个,导致你的图表标题全是“豆腐块”方框
# Windows用户通常使用 SimHei,Mac用户可能需要根据系统字体调整
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号

3.2.1 画布与坐标系:不要搞混了

初学者最容易晕的地方:为什么有时候用 plt.plot(),有时候用 ax.plot()

我们要建立一个概念:

  • Figure (Fig):是整个画布,想象成一块画板。

  • Axes (Ax):是画布上的具体图表区域。一块画板上可以画好几个图(Ax1, Ax2...)。

工程化推荐写法(面向对象风格):

# 数据准备:模拟一周的气温变化
x = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
y = [25, 26, 28, 32, 30, 28, 24]
​
# 1. 创建画布和坐标系
# figsize=(10, 6) 表示画布宽10英寸,高6英寸
fig, ax = plt.subplots(figsize=(10, 6)) 
​
# 2. 在坐标系上绘图
ax.plot(x, y, marker='o', linestyle='-', color='b', label='气温')
​
# 3. 装饰你的图表
ax.set_title("某城市一周气温变化趋势", fontsize=16)
ax.set_xlabel("日期")
ax.set_ylabel("温度 (℃)")
ax.grid(True, linestyle='--', alpha=0.5) # 加网格线,alpha是透明度
ax.legend() # 显示图例
​
# 4. 展示
plt.show()

【开发建议】 尽量使用 fig, ax = plt.subplots() 这种写法。虽然它比直接写 plt.plot() 稍微麻烦一点,但在后续绘制多子图(Subplots)或进行复杂调整时,它能给你最大的控制权。


3.3 Seaborn:统计可视化的美学

如果说Matplotlib是手动挡汽车,Seaborn就是自动挡跑车。它默认集成了Pandas的数据结构,画图非常丝滑。

我们先造一点模拟数据:

# 模拟100个学生的考试数据
data = {
    '数学': np.random.normal(75, 10, 100), # 均值75,标准差10的正态分布
    '英语': np.random.normal(80, 12, 100),
    '班级': np.random.choice(['A班', 'B班'], 100)
}
df = pd.DataFrame(data)

3.3.1 直方图(Distribution Plot):看数据的分布

做AI模型前,必须知道数据是不是正态分布(钟形曲线)。

plt.figure(figsize=(8, 5))
# kde=True 表示同时画出核密度估计曲线(那条平滑的线)
sns.histplot(data=df, x='数学', kde=True, color='skyblue')
plt.title("数学成绩分布图")
plt.show()

3.3.2 散点图(Scatter Plot):看变量的关系

数学好的人,英语也好吗?

plt.figure(figsize=(8, 5))
# hue='班级':按照班级自动上不同的颜色
sns.scatterplot(data=df, x='数学', y='英语', hue='班级', style='班级', s=100)
plt.title("数学 vs 英语成绩关系图")
plt.show()

3.3.3 箱线图(Box Plot):寻找异常值

这是统计学中最强大的图之一。它能告诉你数据的中位数四分位数,以及哪些数据是离群点(Outliers)。在数据清洗阶段,我们常用它来抓出那些填错的数据(比如某人年龄填了200岁)。

plt.figure(figsize=(6, 6))
sns.boxplot(data=df, x='班级', y='数学', palette="Set2")
plt.title("不同班级数学成绩对比")
plt.show()

3.4 工程思维:相关性热力图(Heatmap)

这一节非常重要,是连接数据分析与机器学习的桥梁。

在训练模型时,我们经常问:“哪些特征对结果影响最大?” 或者 “哪些特征之间是重复的?” 热力图可以直观地展示变量之间的相关系数(从 -1 到 1)。

  • 1 表示完全正相关(一起涨)。

  • -1 表示完全负相关(你涨我跌)。

  • 0 表示没关系。

# 计算相关系数矩阵
corr_matrix = df[['数学', '英语']].corr()
​
plt.figure(figsize=(6, 5))
# annot=True 表示在格子里显示数字
# cmap='coolwarm' 是红蓝配色,红色代表正相关,蓝色代表负相关
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title("特征相关性热力图")
plt.show()

3.5 实战案例:HR的秘密——员工离职数据分析

让我们通过一个完整的案例,把上面的知识串起来。 场景:HR给你一份员工数据,想知道为什么最近离职率这么高。是工资给少了?还是加班太多?

3.5.1 数据准备

为了方便演示,我们构造一份包含逻辑关系的模拟数据。

# 构造模拟数据
np.random.seed(42)
n = 200
​
# 满意度:离职的人普遍满意度低
satisfaction = np.concatenate([np.random.normal(0.3, 0.1, 50), np.random.normal(0.7, 0.1, 150)])
# 工作时长:离职的人可能工作时间特别长(过劳)或特别短(摸鱼)
hours = np.concatenate([np.random.normal(280, 20, 50), np.random.normal(200, 30, 150)])
# 离职标签:前50个是离职(1),后150个是在职(0)
left = [1]*50 + [0]*150
# 薪资等级
salary = np.random.choice(['low', 'medium', 'high'], n)
​
hr_df = pd.DataFrame({
    '满意度': satisfaction,
    '月工作时长': hours,
    '薪资': salary,
    '是否离职': left
})
​
# 将离职标签转为文字,方便画图阅读
hr_df['状态'] = hr_df['是否离职'].apply(lambda x: '离职' if x==1 else '在职')

3.5.2 洞察1:谁在离职?(计数图)

先看离职比例和薪资的关系。

plt.figure(figsize=(8, 5))
# countplot 专门用来统计类别数量
sns.countplot(data=hr_df, x='薪资', hue='状态', palette='pastel')
plt.title("不同薪资等级的离职人数对比")
plt.show()

如果你运行代码,可能会发现“low”薪资的人群中,离职柱子比例较高。这就是数据告诉我们的第一个故事:钱没给够。

3.5.3 洞察2:由于什么离职?(小提琴图)

箱线图的进阶版是小提琴图(Violin Plot),它不仅显示统计值,还能显示数据的“胖瘦”(密度)。我们来看看工作时长对离职的影响。

plt.figure(figsize=(8, 5))
sns.violinplot(data=hr_df, x='状态', y='月工作时长', palette='muted')
plt.axhline(y=250, color='r', linestyle='--') # 画一条250小时的警戒线
plt.title("在职与离职员工的工作时长分布")
plt.show()

观察图表,你会发现“离职”组的小提琴在上方有一个“大肚子”,说明很多离职员工的月工时超过了250小时。数据告诉我们第二个故事:太累了。

3.5.4 洞察3:多维分析(PairPlot)

有没有办法一次性把所有变量两两之间的关系都画出来?有,Seaborn的核武器:pairplot

# hue='状态' 会让所有图表都根据离职状态上色
sns.pairplot(hr_df, hue='状态', vars=['满意度', '月工作时长'], height=3)
plt.show()

这张图会展示一个清晰的聚类:左上角(低满意度、高时长)聚集了大量的离职红点。这就是AI模型最容易学习到的特征模式。


3.6 章节小结

数据可视化不是为了画画,而是为了翻译。我们将冰冷的数字翻译成了人类视觉能瞬间理解的图形。

  • 我们掌握了 Matplotlib 的画布与坐标轴,学会了精细控制。

  • 我们体验了 Seaborn 的极简美学,用几行代码完成了复杂的统计图表。

  • 最重要的是,我们学会了用热力图分布图去侦察数据,这是训练任何AI模型前必须做的“战前侦察”。

到目前为止,你已经掌握了Python环境、数据清洗(Pandas)和数据可视化(Matplotlib)。也就是说,数据分析三剑客你已收入囊中。

下一章,我们将正式进入激动人心的篇章——机器学习。我们将用这些工具,教会计算机如何预测房价。


3.7 思考与扩展练习

  1. 保存成果: 在Jupyter Notebook里画图很爽,但怎么发给老板?请查阅 plt.savefig() 的文档,尝试将上面画的图表保存为高分辨率的 .png.pdf 文件。

    • 提示:注意 dpi 参数和 bbox_inches='tight' 参数的作用。

  2. 实战挑战: 使用第2章生成的 sales_dirty.csv(清洗后的版本),尝试画出一个折线图,展示每一天的销售额变化趋势。

  3. 设计思维: 如果你的图表是要给色盲用户看的,或者要打印成黑白的,你应该如何调整Seaborn的配色方案(Palette)?尝试查找 Seaborn 文档中的 color_palette 相关内容。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐