Python爬虫实战㉓|Seaborn高级可视化,统计图表一招搞定
·
author: 专注Python实战,分享爬虫与数据分析干货
title: Python爬虫实战㉓|Seaborn高级可视化,统计图表一招搞定
update: 2026-04-26
tags: Python,Seaborn,可视化,热力图,箱线图,小提琴图,分布图,统计图
作者:专注Python实战,分享爬虫与数据分析干货
更新时间:2026年4月
适合人群:有Matplotlib基础、想画更专业统计图表的开发者
前言:Seaborn = Matplotlib的美颜版
Matplotlib画图需要手动调整很多细节。Seaborn默认就好看,且专攻统计图表。
一行代码,画出论文级图表。
一、安装与配置
pip install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 配置
sns.set_theme(style="whitegrid", font="SimHei") # 主题+中文字体
plt.rcParams["axes.unicode_minus"] = False
# 内置数据集
tips = sns.load_dataset("tips") # 小费数据
print(tips.head())
二、分布图
2.1 直方图 + KDE
# 单变量分布
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.histplot(tips["total_bill"], kde=True, ax=axes[0], color="#4472C4")
axes[0].set_title("账单金额分布")
sns.histplot(data=tips, x="total_bill", hue="time", kde=True, ax=axes[1])
axes[1].set_title("按时段分布")
plt.tight_layout()
plt.savefig("seaborn_hist.png", dpi=150)
plt.show()
2.2 KDE密度图
plt.figure(figsize=(8, 5))
sns.kdeplot(data=tips, x="total_bill", hue="time", fill=True, alpha=0.5)
plt.title("账单金额密度图")
plt.tight_layout()
plt.savefig("seaborn_kde.png", dpi=150)
plt.show()
三、关系图
3.1 散点图(scatterplot)
plt.figure(figsize=(8, 6))
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", style="time", s=80)
plt.title("账单金额 vs 小费")
plt.tight_layout()
plt.savefig("seaborn_scatter.png", dpi=150)
plt.show()
3.2 回归图(regplot/lmplot)
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# 简单回归
sns.regplot(data=tips, x="total_bill", y="tip", ax=axes[0],
scatter_kws={"alpha": 0.5}, line_kws={"color": "red"})
axes[0].set_title("回归分析")
# 分组回归
sns.lmplot(data=tips, x="total_bill", y="tip", col="time", height=5, aspect=1)
plt.savefig("seaborn_reg.png", dpi=150)
plt.show()
四、分类图
4.1 箱线图(boxplot)
plt.figure(figsize=(8, 6))
sns.boxplot(data=tips, x="day", y="total_bill", hue="time", palette="Set2")
plt.title("各天账单金额分布")
plt.tight_layout()
plt.savefig("seaborn_box.png", dpi=150)
plt.show()
4.2 小提琴图(violinplot)
plt.figure(figsize=(8, 6))
sns.violinplot(data=tips, x="day", y="total_bill", hue="time",
split=True, inner="quartile", palette="muted")
plt.title("各天账单金额分布(小提琴图)")
plt.tight_layout()
plt.savefig("seaborn_violin.png", dpi=150)
plt.show()
4.3 柱状图(barplot)
plt.figure(figsize=(8, 5))
sns.barplot(data=tips, x="day", y="total_bill", hue="time", palette="Set2",
estimator=np.mean, errorbar="sd") # 均值±标准差
plt.title("各天平均账单金额")
plt.tight_layout()
plt.savefig("seaborn_bar.png", dpi=150)
plt.show()
4.4 计数图(countplot)
plt.figure(figsize=(8, 5))
sns.countplot(data=tips, x="day", hue="time", palette="Set2")
plt.title("各天订单数量")
plt.tight_layout()
plt.savefig("seaborn_count.png", dpi=150)
plt.show()
五、矩阵图
5.1 热力图(heatmap)
# 相关性热力图
plt.figure(figsize=(8, 6))
numeric_tips = tips.select_dtypes(include=[np.number])
corr = numeric_tips.corr()
sns.heatmap(corr, annot=True, fmt=".2f", cmap="RdYlBu_r",
center=0, square=True, linewidths=0.5)
plt.title("特征相关性热力图")
plt.tight_layout()
plt.savefig("seaborn_heatmap.png", dpi=150)
plt.show()
5.2 聚类热力图(clustermap)
sns.clustermap(corr, annot=True, fmt=".2f", cmap="RdYlBu_r",
figsize=(8, 8), standard_scale=None)
plt.savefig("seaborn_cluster.png", dpi=150)
plt.show()
六、多图组合
6.1 pairplot(两两关系)
g = sns.pairplot(tips, hue="time", height=2.5,
diag_kind="kde", plot_kws={"alpha": 0.5})
g.figure.suptitle("两两关系图", y=1.02, fontsize=16)
plt.savefig("seaborn_pair.png", dpi=150)
plt.show()
6.2 jointplot(联合分布)
g = sns.jointplot(data=tips, x="total_bill", y="tip",
kind="reg", height=8, ratio=4,
scatter_kws={"alpha": 0.5})
g.figure.suptitle("账单 vs 小费联合分布", y=1.02)
plt.savefig("seaborn_joint.png", dpi=150)
plt.show()
七、实战:电商数据可视化
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 模拟数据
np.random.seed(42)
df = pd.DataFrame({
"品类": np.random.choice(["手机", "电脑", "耳机"], 300),
"城市": np.random.choice(["北京", "上海", "广州"], 300),
"价格": np.random.lognormal(7, 0.5, 300).round(2),
"评分": np.clip(np.random.normal(4.2, 0.6, 300), 1, 5).round(1),
"销量": np.random.randint(10, 500, 300),
})
# 1. 价格分布
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
sns.histplot(data=df, x="价格", hue="品类", kde=True, ax=axes[0])
axes[0].set_title("各品类价格分布")
# 2. 品类×城市 热力图
pivot = df.pivot_table(values="销量", index="城市", columns="品类", aggfunc="mean")
sns.heatmap(pivot, annot=True, fmt=".0f", cmap="YlOrRd", ax=axes[1])
axes[1].set_title("平均销量热力图")
plt.tight_layout()
plt.savefig("ecommerce_viz.png", dpi=150)
plt.show()
# 3. 评分 vs 价格
plt.figure(figsize=(8, 6))
sns.scatterplot(data=df, x="价格", y="评分", hue="品类", size="销量",
sizes=(20, 200), alpha=0.6)
plt.title("价格 vs 评分(气泡大小=销量)")
plt.tight_layout()
plt.savefig("scatter_bubble.png", dpi=150)
plt.show()
八、知识卡
| 图表类型 | 函数 | 适用场景 |
|---|---|---|
| histplot | 直方图+KDE | 分布 |
| kdeplot | 密度图 | 分布对比 |
| scatterplot | 散点图 | 相关性 |
| regplot/lmplot | 回归图 | 线性关系 |
| boxplot | 箱线图 | 分组分布 |
| violinplot | 小提琴图 | 分布细节 |
| barplot | 柱状图 | 分组均值 |
| countplot | 计数图 | 频次统计 |
| heatmap | 热力图 | 相关性矩阵 |
| pairplot | 两两关系 | 多变量探索 |
| jointplot | 联合分布 | 双变量详细分析 |
九、课后作业
必做题:
- 用Seaborn画分布图和箱线图
- 画相关性热力图
- 用pairplot探索多变量关系
选做题:
- 用Seaborn制作完整的数据分析报告
- 对比Seaborn与Matplotlib的风格差异
有问题欢迎评论区留言,大家一起讨论!
标签:Python | Seaborn | 可视化 | 热力图 | 箱线图 | 小提琴图 | 统计图表
更多推荐
所有评论(0)