Day 51:【99天精通Python】数据可视化 Seaborn 进阶 - 绘图从此优雅

前言

欢迎来到第51天!

在昨天,我们学习了 Matplotlib。虽然它功能强大,但默认的样式比较"原始",而且画一些复杂的统计图表(如热力图、箱线图)需要写很多代码。

Seaborn 是基于 Matplotlib 构建的高级绘图库。它的特点是:

  1. 颜值高:默认主题就很漂亮。
  2. 代码少:Matplotlib 写 10 行的图,Seaborn 可能只要 1 行。
  3. 统计友好:专为统计数据可视化设计,能直接处理 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 绘图

Relational (关系)

Distribution (分布)

Categorical (分类)

Matrix (矩阵)

relplot (kind='scatter'/'line')

displot (直方图/KDE)

jointplot (联合分布)

catplot

kind='box' (箱线图)

kind='violin' (小提琴)

kind='bar' (条形图)

heatmap (热力图)

关键要点

  1. Seaborn = Matplotlib + Pandas + 美颜 + 统计学。
  2. 三大通用绘图接口:relplot, displot, catplot(通过 kind 参数切换具体图表)。
  3. 善用 hue 参数,它能帮你轻松实现多维数据的分组展示。

九、课后作业

  1. 航班热力图:加载 flights = sns.load_dataset("flights"),将数据透视 (pivot) 成一个矩阵(行是月份,列是年份,值是乘客数),然后绘制热力图。
  2. 鸢尾花分析:加载 iris = sns.load_dataset("iris"),使用 sns.pairplot(iris, hue="species") 一行代码绘制出所有变量两两之间的关系图(散点图矩阵)。
  3. 自定义风格:尝试修改 sns.set_theme() 的参数,画出一张白底、无网格线、字体稍微大一点的箱线图。

下节预告

Day 52:Web 开发入门 (Flask) - 数据分析告一段落。明天我们将开启全新的领域——Web 开发!我们将用 Flask 框架写出你的第一个网页。


系列导航

  • 上一篇:Day 50 - 数据可视化Matplotlib基础
  • 下一篇:Day 52 - Web开发入门Flask(待更新)
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐