第 47 课:数据可视化 - Seaborn 统计图表
学习目标
通过本课的学习,你将能够:
- 理解 Seaborn 的设计理念及其与 Matplotlib 的关系。
- 使用 Seaborn 设置全局绘图主题和风格,使图表更美观。
- 熟练运用 Seaborn 创建常见的统计图表,如直方图、散点图、箱线图和热力图。
- 利用分面网格(FacetGrid)绘制多子图以分析数据的多维分布。
- 结合 Pandas DataFrame,高效地进行数据探索性分析(EDA)可视化。
核心概念
Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高层次的接口来绘制有吸引力且信息丰富的统计图形。如果说 Matplotlib 是"画家",那么 Seaborn 就是一套高级的"绘画工具包",它让你能用更少的代码,专注于数据故事本身,而不是图形的细节调整。
核心优势:
- 与 Pandas 无缝集成:直接接受 DataFrame 和 Series 作为数据输入。
- 自动统计计算:许多图表(如箱线图)内部自动计算了均值、分位数等统计量。
- 美观的默认主题:开箱即用的配色和样式,远胜于 Matplotlib 的默认风格。
- 简化复杂图表:轻松创建多图网格、回归图等复杂可视化。
1. 设置绘图主题
import seaborn as sns
import matplotlib.pyplot as plt
# 设置 Seaborn 风格
sns.set_theme(style="whitegrid") # 其他选项:`darkgrid`, `white`, `ticks`
# 也可以使用更详细的设置
# sns.set_theme(style="ticks", palette="pastel")
2. 基础统计图表示例
Seaborn 的绘图函数主要分为轴级函数和图级函数。轴级函数(如 sns.histplot())绑定到一个 Matplotlib Axes 对象;图级函数(如 sns.catplot())创建并管理整个图窗。
代码示例
以下代码完整演示如何使用 Seaborn 进行数据探索。我们使用 Seaborn 内置的经典的"鸢尾花"数据集。
# 第47课:Seaborn统计图表示例
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 加载内置数据集
tips = sns.load_dataset("tips")
print("数据集前5行:")
print(tips.head())
# 1. 设置全局主题
sns.set_theme(style="darkgrid", palette="husl")
# 2. 创建画布
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 3. 绘制直方图 (Displot - 图级函数,可以分配到子图)
# 展示总消费金额的分布
sns.histplot(data=tips, x="total_bill", kde=True, ax=axes[0, 0])
axes[0, 0].set_title("总消费金额分布 (直方图+核密度估计)")
# 4. 绘制散点图 (Scatterplot - 轴级函数)
# 探索小费与总账单的关系,并按性别着色
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex", ax=axes[0, 1])
axes[0, 1].set_title("总账单 vs 小费 (按性别分组)")
# 5. 绘制箱线图 (Boxplot - 轴级函数)
# 比较不同用餐时段的总消费分布
sns.boxplot(data=tips, x="time", y="total_bill", ax=axes[1, 0])
axes[1, 0].set_title("不同用餐时段的总账单分布 (箱线图)")
# 6. 绘制计数图 (Countplot - 轴级函数)
# 统计不同性别的顾客数量
sns.countplot(data=tips, x="day", hue="sex", ax=axes[1, 1])
axes[1, 1].set_title("不同日期顾客数量统计 (按性别分组)")
plt.tight_layout()
plt.show()
# 7. 绘制热力图 (Heatmap - 展示相关性矩阵)
# 选择数值列,计算相关系数矩阵
numeric_cols = tips[["total_bill", "tip", "size"]]
corr_matrix = numeric_cols.corr()
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("数值变量间的相关系数热力图")
plt.show()
实践练习
练习 1:基础图表练习(易)
使用 Seaborn 内置的 iris (鸢尾花) 数据集,绘制一个散点图,展示 sepal_length(花萼长度)和 sepal_width(花萼宽度)的关系,并用 species(物种)列作为颜色分组 (hue)。
要求:
- 设置主题为
whitegrid。 - 图表标题为 "鸢尾花花萼尺寸关系"。
练习 2:统计图表应用(中)
使用 tips 数据集,创建一个分面网格图 (FacetGrid 或 catplot),用于对比不同用餐日期 (day) 在午餐 (Lunch) 和晚餐 (Dinner) 时段的总账单 (total_bill) 分布。
要求:
- 使用
sns.catplot或sns.FacetGrid+sns.boxplot。 - 行轴为日期 (
day),列轴为用餐时段 (time)。 - 每个子图展示该组合下的
total_bill箱线图。 - 设置合适的图表高度和长宽比。
练习 3:综合数据探索(难)
加载 titanic 数据集 (sns.load_dataset("titanic")),完成以下可视化任务:
- 绘制一个堆叠的柱状图 (
countplot,配合hue参数),展示不同船舱等级 (class) 的乘客中,生还 (survived=1) 与遇难 (survived=0) 的人数。 - 绘制一个带有核密度估计 (
kde=True) 的直方图 (histplot),对比生还者与遇难者的年龄分布 (age)。 提示:你可能需要先对数据进行简单的处理,例如处理缺失值。
常见错误
- 混淆 Seaborn 和 Matplotlib 的参数:Seaborn 函数参数名有时与 Matplotlib 不同(如
huevsc)。请以 Seaborn 官方文档为准。 - 错误使用
hue参数:hue用于根据另一个分类变量对图形元素进行分组着色。确保传给hue的列是分类类型或能被当作分类处理的列。 - 忽略数据格式:许多 Seaborn 函数期望长格式 (tidy) 数据。如果你的数据是宽格式,可能需要使用
pd.melt()进行转换。 - 过度依赖默认样式:虽然默认样式很好,但在正式报告或论文中,你可能需要调整字体、标签、图例等以满足特定格式要求,这时需要结合 Matplotlib 的语法。
- 忘记
plt.show():在 Jupyter Notebook 以外的环境中,需要显式调用plt.show()来显示图形。
小结
本课我们学习了 Seaborn,一个强大的统计可视化库。关键要点包括:
- Seaborn 的核心价值:它简化了在 Pandas DataFrame 上创建复杂、美观统计图表的过程。
- 主题与样式:使用
sns.set_theme()可以一键提升所有图表的专业外观。 - 核心图表类型:掌握了
histplot(分布)、scatterplot(关系)、boxplot(分类分布)、countplot(计数) 和heatmap(相关性) 等常用图表的创建方法。 hue参数:这是 Seaborn 最强大的功能之一,用于引入第三个变量,通过颜色进行分组对比。- 分面绘图:使用
FacetGrid或catplot可以轻松创建多子图网格,用于对比不同子集下的数据分布。
掌握了 Seaborn,你将能更高效地进行数据探索,并制作出能清晰传达数据洞察的专业图表。在下节课中,我们将学习数据分析的基石——NumPy,了解如何用它进行高效的数值计算。