28·数据处理进阶

进阶数据可视化:Seaborn 与 Plotly

visualizationseaborn

第28课 - 进阶数据可视化:Seaborn 与 Plotly

课程:机器学习:从入门到实战 所属模块:数据处理 难度:intermediate 标签:visualization, seaborn, plotly, interactive

1. 学习目标

完成本课学习后,你将能够:

  1. 理解 Seaborn 与 Plotly 的核心差异与适用场景。
  2. 使用 Seaborn 快速绘制专业的统计图表(如小提琴图、热力图、分面图)。
  3. 使用 Plotly 创建高度交互式的数据可视化图表。
  4. 为不同的数据分析目的(探索、报告、展示)选择合适的可视化工具。

2. 核心概念

在上一课的探索性数据分析(EDA)中,我们使用了 Matplotlib 进行基础绘图。本课将介绍两个更高级、更强大的库,它们能极大提升你的数据可视化效率和效果。

Seaborn:统计可视化利器

Seaborn 是基于 Matplotlib 的 Python 数据可视化库。它的核心优势在于:

  • 高级接口:只需一行代码就能绘制复杂的统计图表(如小提琴图、核密度估计图)。
  • 美观的默认样式:提供了比 Matplotlib 更现代、更吸引人的默认主题和调色板。
  • 与 Pandas 深度集成:可以直接接收 DataFrame 和列名作为参数,非常适合数据分析工作流。

Plotly:交互式可视化之星

Plotly 是一个创建交互式、出版质量图表的库。它的核心优势在于:

  • 真正的交互性:图表支持缩放、平移、悬停显示详细信息、点击筛选等操作。
  • 丰富的图表类型:从基础图表到3D图、地理空间图,几乎无所不包。
  • 多环境输出:图表可以在 Jupyter Notebook 中交互式显示,也可以轻松导出为 HTML 网页或静态图片。

简单来说,Seaborn 擅长快速绘制静态的、用于学术论文或技术报告的精美统计图。Plotly 擅长制作需要用户交互探索的、用于网页或演示文稿的动态图表。

3. 代码示例

我们将使用一个内置数据集 tips 来演示。

准备工作:安装与导入

# 确保已安装所需库
# pip install seaborn plotly pandas

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.express as px

# 加载示例数据集
tips = sns.load_dataset('tips')
print(tips.head())
print(f"\n数据集形状: {tips.shape}")

示例一:使用 Seaborn 进行高级统计可视化

# 设置Seaborn风格
sns.set_theme(style="whitegrid")

# 创建一个包含多个子图的画布
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 1. 小提琴图:展示数值变量随分类变量的分布(比箱线图更丰富)
sns.violinplot(x="day", y="total_bill", data=tips, ax=axes[0, 0])
axes[0, 0].set_title('每日账单金额分布(小提琴图)')

# 2. 热力图:展示变量间的相关性矩阵
numeric_tips = tips.select_dtypes(include=['number'])  # 选择数值列
corr_matrix = numeric_tips.corr()
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, ax=axes[0, 1])
axes[0, 1].set_title('变量相关性热力图')

# 3. 分面网格图:按“是否吸烟者”分面,探索“总账单”、“小费”和“用餐时间”的关系
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", style="smoker", ax=axes[1, 0])
axes[1, 0].set_title('账单与小费关系(按用餐时间与吸烟状态)')

# 4. 核密度估计图:展示两个数值变量的联合分布
sns.kdeplot(data=tips, x="total_bill", y="tip", fill=True, ax=axes[1, 1])
axes[1, 1].set_title('账单与小费联合分布(KDE图)')

plt.tight_layout()
plt.savefig('seaborn_examples.png', dpi=150, bbox_inches='tight')
plt.show()
print("Seaborn 静态图表已保存为 'seaborn_examples.png'")

示例二:使用 Plotly 创建交互式图表

# 1. 交互式散点图:悬停查看详细信息,通过图例筛选类别
fig_scatter = px.scatter(
    tips,
    x="total_bill",
    y="tip",
    color="time",         # 按用餐时间着色
    size="size",          # 点的大小表示用餐人数
    hover_data=["day", "smoker"],  # 悬停时显示额外信息
    title="互动探索:账单 vs 小费"
)
# 在Jupyter Notebook中直接显示交互式图表
fig_scatter.show()

# 2. 交互式箱线图与小提琴图切换
fig_box = px.box(
    tips,
    x="day",
    y="total_bill",
    color="smoker",
    points="all",        # 显示所有数据点
    title="每日账单分布(交互式箱线图)"
)
fig_box.show()
# 3. 保存交互式图表为HTML文件(可分享给他人用浏览器打开)
fig_scatter.write_html("interactive_scatter.html")
print("交互式散点图已保存为 'interactive_scatter.html',可用浏览器打开。")

# 4. 创建子图布局(Plotly的`make_subplots`)
from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig_sub = make_subplots(rows=1, cols=2, subplot_titles=("小费分布", "账单分布"))

# 添加两个直方图
fig_sub.add_trace(go.Histogram(x=tips['tip'], name='小费'), row=1, col=1)
fig_sub.add_trace(go.Histogram(x=tips['total_bill'], name='账单'), row=1, col=2)

fig_sub.update_layout(title_text="小费与账单分布对比(交互式子图)")
fig_sub.show()

4. 实践练习

练习1(基础):Seaborn 基础应用

使用 Seaborn 的 tips 数据集,绘制一个 countplot,展示每周不同天(day)的顾客数量。要求使用 pastel 色板,并添加合适的标题。

预期输出:一个柱状图,x轴为星期几,y轴为出现次数,颜色柔和。

练习2(进阶):Plotly 交互式散点图矩阵

使用 Plotly Express 的 scatter_matrix 函数,创建 tips 数据集中 total_bill, tip, size 三个数值变量的散点图矩阵。要求根据 time 变量着色,并设置对角线图为直方图。

预期输出:一个3x3的交互式矩阵图,对角线是直方图,非对角线是散点图,悬停可显示数据点信息。

练习3(综合):组合分析与可视化

  1. 创建一个新的列 tip_percentage,计算 tip / total_bill * 100
  2. 使用 Seaborn 绘制一个 boxplot,比较工作日与周末的 tip_percentage 分布。
  3. 使用 Plotly 绘制一个交互式散点图,展示 total_billtip_percentage 的关系,并用颜色区分 day,用大小表示 size
  4. 思考:在哪个场景下你会选择保存Seaborn生成的静态图?哪个场景下选择Plotly的交互式图?

5. 常见错误

  1. 混淆 Seaborn 和 Matplotlib 的样式设置:尝试在 Seaborn 绘图后使用 plt.title() 设置标题是可行的,但更推荐使用 Seaborn 返回的 Axes 对象(如 ax.set_title())来保持一致性。
  2. 数据格式问题:Plotly Express 通常期望“整洁数据”(Tidy Data),即每列是一个变量,每行是一个观测值。确保你的数据是这种格式。
  3. 忘记在 Jupyter 外保存交互图:在 Jupyter Notebook 中,fig.show() 可以直接显示。但如果要在普通Python脚本中生成交互图,必须使用 write_html() 方法保存,否则图表不会显示。
  4. 过度绘制(Overplotting):当数据点过多时,散点图会重叠严重,难以看清分布。解决方法是使用透明度(alpha 参数)、调整点的大小(size),或改用其他图表类型(如Hexbin图)。

6. 小结

本课我们学习了两大进阶可视化工具:

  • Seaborn静态统计图表的专家。它极大简化了绘制小提琴图、热力图、分面图等复杂图表的过程,并能与 Pandas 无缝协作。非常适合用于数据分析过程中的快速探索,以及生成高质量的技术报告和论文插图
  • Plotly交互式数据可视化的首选。它生成的图表具有丰富的交互功能,能够引导观众自主探索数据。非常适合用于制作数据演示报告、构建数据仪表盘(Dashboard)以及开发Web应用

选择建议

  • 探索阶段:快速原型、统计检验 → Seaborn
  • 展示阶段:汇报、发布、Web展示 → Plotly
  • 记忆技巧:Seaborn 像是专业的“静态照相机”,拍出精美的统计照片;Plotly 像是“可交互的显微镜”,让用户能自由探索数据细节。

掌握这两个工具,将使你在数据可视化的维度上获得巨大的提升,为后续的机器学习建模和成果展示打下坚实基础。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「线性回归原理与实现」 以巩固所学知识。