《Python AI入门》第3章 让数据说话——Matplotlib与Seaborn的数据可视化美学
本章我们将从零开始,掌握Matplotlib 和 Seaborn这两大神器
章节导语
“一张图胜过千言万语。如果你的老板没时间看你的Python代码,也没耐心读几千行的Excel数据,那就甩给他一张图表。”
在AI领域,可视化不仅仅是为了“好看”,更是为了“诊断”。数据科学家就像医生,图表就是X光片。通过可视化,我们可以一眼看出数据分布是否正常、特征之间是否有关系、模型训练是否过拟合。
在Python的世界里,有两个名字如雷贯耳:Matplotlib 和 Seaborn。
-
Matplotlib 是老牌的底层绘图库,它像是一套专业的“绘图工具箱”,给你纸笔和尺子,你想怎么画都行,但需要你对每一个线条有精准的控制。
-
Seaborn 则是基于Matplotlib构建的高级库,它更像是一个“美颜相机”或“滤镜”,只需要一行代码,就能生成配色优雅、符合统计学审美的图表。
本章我们将从零开始,掌握这两大神器,让枯燥的数据在屏幕上跳舞。
3.1 学习目标
在学完本章后,你将能够:
-
掌握绘图解剖学:理解Figure(画布)与Axes(坐标系)的区别。
-
解决痛点:彻底搞定Matplotlib中文显示乱码的“顽疾”。
-
美学升级:熟练使用Seaborn绘制直方图、散点图和箱线图。
-
AI工程思维:学会使用热力图(Heatmap)筛选特征,这是机器学习前的必修课。
-
实战落地:通过一个“员工离职分析”案例,用图表挖掘数据背后的秘密。
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 思考与扩展练习
-
保存成果: 在Jupyter Notebook里画图很爽,但怎么发给老板?请查阅
plt.savefig()的文档,尝试将上面画的图表保存为高分辨率的.png或.pdf文件。-
提示:注意
dpi参数和bbox_inches='tight'参数的作用。
-
-
实战挑战: 使用第2章生成的
sales_dirty.csv(清洗后的版本),尝试画出一个折线图,展示每一天的销售额变化趋势。 -
设计思维: 如果你的图表是要给色盲用户看的,或者要打印成黑白的,你应该如何调整Seaborn的配色方案(Palette)?尝试查找 Seaborn 文档中的
color_palette相关内容。
更多推荐




所有评论(0)