Day 51:【99天精通Python】数据可视化 Seaborn 进阶 - 绘图从此优雅
·
Day 51:【99天精通Python】数据可视化 Seaborn 进阶 - 绘图从此优雅
前言
欢迎来到第51天!
在昨天,我们学习了 Matplotlib。虽然它功能强大,但默认的样式比较"原始",而且画一些复杂的统计图表(如热力图、箱线图)需要写很多代码。
Seaborn 是基于 Matplotlib 构建的高级绘图库。它的特点是:
- 颜值高:默认主题就很漂亮。
- 代码少:Matplotlib 写 10 行的图,Seaborn 可能只要 1 行。
- 统计友好:专为统计数据可视化设计,能直接处理 Pandas DataFrame。
如果说 Matplotlib 是"手排挡汽车"(控制力强但操作繁琐),Seaborn 就是"自动挡跑车"(简单、舒适、好看)。
本节内容:
- Seaborn 安装与主题设置
- 关系图 (Relplot):散点与折线
- 分布图 (Displot):直方图与核密度
- 分类图 (Catplot):箱线图与小提琴图
- 矩阵图 (Heatmap):热力图
- 实战练习:泰坦尼克号生存分析可视化
一、安装与主题
pip install seaborn
在代码中导入:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 设置主题 (darkgrid, whitegrid, dark, white, ticks)
sns.set_theme(style="darkgrid")
# 加载示例数据 (Seaborn 自带了一些数据集,需要联网下载)
# tips: 餐厅小费数据
tips = sns.load_dataset("tips")
print(tips.head())
二、关系绘图 (Relational)
用于展示两个变量之间的关系。
2.1 散点图 (Scatter Plot)
Matplotlib 里的 scatter 需要分别指定 x 和 y 的数组。
Seaborn 可以直接传入 DataFrame,然后指定列名。
# hue="smoker": 按是否吸烟区分颜色
# size="size": 按用餐人数区分点的大小
sns.relplot(
data=tips,
x="total_bill", y="tip",
hue="smoker", size="size",
kind="scatter"
)
plt.show()
2.2 折线图 (Line Plot)
# fmri: 大脑核磁共振数据
fmri = sns.load_dataset("fmri")
# kind="line"
# Seaborn 会自动计算均值并画出置信区间 (阴影部分)
sns.relplot(
data=fmri,
x="timepoint", y="signal",
hue="event", kind="line"
)
plt.show()
三、分布绘图 (Distribution)
用于观察数据的分布情况。
3.1 直方图 (Hist Plot)
# kde=True: 显示核密度曲线 (平滑曲线)
sns.displot(data=tips, x="total_bill", kde=True)
plt.show()
3.2 联合分布图 (Joint Plot)
同时展示两个变量的关系分布和单变量分布。
sns.jointplot(data=tips, x="total_bill", y="tip", hue="sex")
plt.show()
四、分类绘图 (Categorical)
这是 Seaborn 最强的地方,非常适合比较不同类别的数据。
4.1 箱线图 (Box Plot)
箱线图能显示数据的最大值、最小值、中位数和异常值。
# x轴: 星期几, y轴: 账单金额
sns.catplot(data=tips, x="day", y="total_bill", kind="box")
plt.show()
4.2 小提琴图 (Violin Plot)
箱线图的升级版,还能显示数据的密度分布(胖瘦)。
# split=True: 将hue的两类画在提琴的两边
sns.catplot(
data=tips,
x="day", y="total_bill",
hue="sex", split=True,
kind="violin"
)
plt.show()
五、矩阵绘图:热力图 (Heatmap)
热力图常用于展示相关性矩阵。
# 计算相关系数矩阵
corr = tips.corr(numeric_only=True)
plt.figure(figsize=(8, 6))
# annot=True: 在格子里显示数值
# cmap="coolwarm": 颜色映射 (蓝-红)
sns.heatmap(corr, annot=True, cmap="coolwarm")
plt.title("Correlation Heatmap")
plt.show()
六、实战练习:泰坦尼克号生存分析
我们使用经典的 Titanic 数据集,分析什么样的人更容易存活。
titanic = sns.load_dataset("titanic")
# 1. 舱位等级 (class) 与 生存率 (survived) 的关系
# kind="bar": 条形图,默认计算平均值 (即生存率)
sns.catplot(data=titanic, x="class", y="survived", kind="bar")
plt.title("Survival Rate by Class")
plt.show()
# 2. 性别 (sex) 与 生存率
sns.catplot(data=titanic, x="sex", y="survived", kind="bar")
plt.title("Survival Rate by Sex")
plt.show()
# 3. 年龄分布 (分活下来的和没活下来的)
sns.displot(data=titanic, x="age", hue="survived", kde=True)
plt.title("Age Distribution by Survival")
plt.show()
分析结论:
- 头等舱的生存率远高于三等舱。
- 女性的生存率远高于男性(Lady First)。
- 婴儿的生存率较高。
七、常见问题
Q1:Seaborn 画图怎么保存?
Seaborn 是基于 Matplotlib 的,所以保存方法一样:
# 画完图后
plt.savefig("my_seaborn_plot.png", dpi=300)
Q2:中文乱码怎么办?
解决方法同 Matplotlib(见 Day 50),需要在 import seaborn 之前或之后设置 plt.rcParams。
八、小结
关键要点:
- Seaborn = Matplotlib + Pandas + 美颜 + 统计学。
- 三大通用绘图接口:
relplot,displot,catplot(通过kind参数切换具体图表)。 - 善用
hue参数,它能帮你轻松实现多维数据的分组展示。
九、课后作业
- 航班热力图:加载
flights = sns.load_dataset("flights"),将数据透视 (pivot) 成一个矩阵(行是月份,列是年份,值是乘客数),然后绘制热力图。 - 鸢尾花分析:加载
iris = sns.load_dataset("iris"),使用sns.pairplot(iris, hue="species")一行代码绘制出所有变量两两之间的关系图(散点图矩阵)。 - 自定义风格:尝试修改
sns.set_theme()的参数,画出一张白底、无网格线、字体稍微大一点的箱线图。
下节预告
Day 52:Web 开发入门 (Flask) - 数据分析告一段落。明天我们将开启全新的领域——Web 开发!我们将用 Flask 框架写出你的第一个网页。
系列导航:
- 上一篇:Day 50 - 数据可视化Matplotlib基础
- 下一篇:Day 52 - Web开发入门Flask(待更新)
更多推荐
所有评论(0)