第28课 - 进阶数据可视化:Seaborn 与 Plotly
课程:机器学习:从入门到实战 所属模块:数据处理 难度:intermediate 标签:visualization, seaborn, plotly, interactive
1. 学习目标
完成本课学习后,你将能够:
- 理解 Seaborn 与 Plotly 的核心差异与适用场景。
- 使用 Seaborn 快速绘制专业的统计图表(如小提琴图、热力图、分面图)。
- 使用 Plotly 创建高度交互式的数据可视化图表。
- 为不同的数据分析目的(探索、报告、展示)选择合适的可视化工具。
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(综合):组合分析与可视化
- 创建一个新的列
tip_percentage,计算tip / total_bill * 100。 - 使用 Seaborn 绘制一个
boxplot,比较工作日与周末的tip_percentage分布。 - 使用 Plotly 绘制一个交互式散点图,展示
total_bill与tip_percentage的关系,并用颜色区分day,用大小表示size。 - 思考:在哪个场景下你会选择保存Seaborn生成的静态图?哪个场景下选择Plotly的交互式图?
5. 常见错误
- 混淆 Seaborn 和 Matplotlib 的样式设置:尝试在 Seaborn 绘图后使用
plt.title()设置标题是可行的,但更推荐使用 Seaborn 返回的Axes对象(如ax.set_title())来保持一致性。 - 数据格式问题:Plotly Express 通常期望“整洁数据”(Tidy Data),即每列是一个变量,每行是一个观测值。确保你的数据是这种格式。
- 忘记在 Jupyter 外保存交互图:在 Jupyter Notebook 中,
fig.show()可以直接显示。但如果要在普通Python脚本中生成交互图,必须使用write_html()方法保存,否则图表不会显示。 - 过度绘制(Overplotting):当数据点过多时,散点图会重叠严重,难以看清分布。解决方法是使用透明度(
alpha参数)、调整点的大小(size),或改用其他图表类型(如Hexbin图)。
6. 小结
本课我们学习了两大进阶可视化工具:
- Seaborn 是静态统计图表的专家。它极大简化了绘制小提琴图、热力图、分面图等复杂图表的过程,并能与 Pandas 无缝协作。非常适合用于数据分析过程中的快速探索,以及生成高质量的技术报告和论文插图。
- Plotly 是交互式数据可视化的首选。它生成的图表具有丰富的交互功能,能够引导观众自主探索数据。非常适合用于制作数据演示报告、构建数据仪表盘(Dashboard)以及开发Web应用。
选择建议:
- 探索阶段:快速原型、统计检验 → Seaborn
- 展示阶段:汇报、发布、Web展示 → Plotly
- 记忆技巧:Seaborn 像是专业的“静态照相机”,拍出精美的统计照片;Plotly 像是“可交互的显微镜”,让用户能自由探索数据细节。
掌握这两个工具,将使你在数据可视化的维度上获得巨大的提升,为后续的机器学习建模和成果展示打下坚实基础。
练习编辑器
rust
Loading...