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 联合分布 双变量详细分析

九、课后作业

必做题:

  1. 用Seaborn画分布图和箱线图
  2. 画相关性热力图
  3. 用pairplot探索多变量关系

选做题:

  1. 用Seaborn制作完整的数据分析报告
  2. 对比Seaborn与Matplotlib的风格差异

有问题欢迎评论区留言,大家一起讨论!


标签:Python | Seaborn | 可视化 | 热力图 | 箱线图 | 小提琴图 | 统计图表

更多推荐