本节摘要:Seaborn 是基于 Matplotlib 的高层统计绘图库,专为数据分析设计——它知道"直方图带核密度曲线更好看""箱线图配提琴图信息更全"。本节掌握分布图、箱线图、热力图三个主力图表,再学会主题、调色板定制,让图表既快又专业。
阅读完本节,你应当能够:
用 Matplotlib 画一个带核密度曲线的直方图,要手动调好几行参数;画分组箱线图,得自己按组切数据。这些"统计绘图里高频出现、又有点繁琐"的场景,Seaborn 都封装好了——传一个 DataFrame 和列名,一行出图。Seaborn 的定位不是替代 Matplotlib,而是让统计图更高效、更好看。
Seaborn 的接口面向 DataFrame:sns.histplot(data=df, x="金额") 直接在数据框上按列画图,自动处理缺失、自动加标签、自动分箱。它内部仍然调用 Matplotlib,所以画完还能继续用 Matplotlib 的函数做精细调整。
import seaborn as sns import matplotlib.pyplot as plt sns.histplot(df["金额"], bins=30, kde=True) # 直方图 + 核密度 plt.title("订单金额分布") plt.show()
💡 关键直觉:
kde=True加的曲线能更平滑地显示分布形状,右偏、双峰这类"均值看不见的特征",曲线上一目了然。
sns.boxplot(data=df, x="门店", y="金额") sns.violinplot(data=df, x="门店", y="金额") # 提琴图:更细的分布形状
箱线图里的圆点就是离群值——比单独用统计方法检测直观得多。两三家门店一对比,"哪家客单价波动大"立刻有数。
corr = df[["金额", "订单量", "客单价", "折扣"]].corr() sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f") plt.title("数值特征相关矩阵") plt.show()
annot=True 在格子里显示相关系数数值,cmap 控制颜色映射。看热力图找"亮红"的格子——那就是强相关特征,也是后续建模要重点关注的。
sns.set_theme(style="whitegrid") # 主题:白色背景网格 sns.set_palette("Set2") # 调色板 sns.set_theme(context="paper") # 上下文:影响字号线宽
常用主题:whitegrid(网格)、darkgrid(深色网格)、white(干净)、ticks(刻度)。调色板 Set2、husl、coolwarm 等按需选。
fig, ax = plt.subplots(figsize=(8, 5)) sns.histplot(df["金额"], kde=True, ax=ax) ax.set_title("订单金额分布") ax.axvline(df["金额"].median(), color="red", linestyle="--", label="中位数") ax.legend() plt.show()
Seaborn 图表画在 Matplotlib 的 axes 上,之后一切 Matplotlib 的能力照常可用——axvline 画参考线、set_title 改标题,混用无缝。
⚠️ 常见坑:Seaborn 新版部分函数改名(如 distplot 拆成 histplot/kdeplot)。代码报"module has no attribute"时,优先查新函数名,别在旧 API 上死磕。
| 需求 | 用哪个 | 为什么 |
|---|---|---|
| 快速画一张普通图 | Matplotlib | 轻量直接 |
| 统计图(分布/相关) | Seaborn | 一行出图带统计语义 |
| 精细控制每个细节 | Matplotlib | 全量 API |
| 报表级美观 | Seaborn + set_theme | 默认配色更专业 |
fig, axes = plt.subplots(1, 2, figsize=(12, 4)) # 左图:各门店销售额柱状 sns.barplot(data=df, x="门店", y="销售额", ax=axes[0]) axes[0].set_title("各门店销售额") # 右图:各门店客单价分布 sns.boxplot(data=df, x="门店", y="客单价", ax=axes[1]) axes[1].set_title("各门店客单价分布") plt.tight_layout() plt.show()
一张对比图回答两个问题:哪家卖得多、哪家单价波动大。这就是可视化在业务分析里的日常用法。
| 图表 | 函数 | 用途 |
|---|---|---|
| 计数条形图 | sns.countplot(data, x="类目") |
类别频次 |
| 分组散点 | sns.scatterplot(data, x="金额", y="订单量", hue="门店") |
多维关系 |
| 回归图 | sns.regplot(data, x="金额", y="订单量") |
关系+拟合线 |
| 配对图 | sns.pairplot(df[数值列]) |
多变量全览 |
| 联合分布 | sns.jointplot(data, x, y) |
双变量分布 |
pairplot 一次画出所有数值列两两组合的散点与分布,是 EDA 里"一图看全局"的利器——数据列不多时,用它代替逐个画图效率极高。
配色不是玄学,直接关系信息传达:
⚠️ 常见坑:热力图用默认配色容易"红绿不分",色盲读者直接看不懂。相关矩阵这类连续数值,选
coolwarm或RdYlBu这类两端清晰的渐变,信息传达更可靠。
fig, ax = plt.subplots(figsize=(9, 5)) sns.boxplot(data=df, x="门店", y="金额", palette="Set2", ax=ax) ax.set_title("各门店金额分布") fig.savefig("门店金额分布.png", dpi=200, bbox_inches="tight") plt.show()
bbox_inches="tight" 自动裁剪多余留白,dpi=200 保证报告印刷清晰。图表保存是交付环节,尺寸和分辨率值得多花一行参数。
一句话记住两者的关系:Matplotlib 是"引擎",Seaborn 是"变速箱"。引擎负责最终渲染,变速箱让统计绘图更顺手。具体分工:
实践中 80% 的图表用 Seaborn 起手、Matplotlib 收尾。把这套组合用熟,可视化效率至少翻倍。
| 检查项 | 说明 |
|---|---|
| 图有标题 | 一句话说清"回答什么问题" |
| 轴有标签 | 单位明确(万元、单、天) |
| 类别有图例 | 系列可区分 |
| 配色合理 | 离散用 Set2、连续用渐变 |
| 中文正常 | SimHei 已配置 |
| 分辨率够 | 报告用 dpi 200 以上 |
kde=True 平滑显示分布形状,双峰右偏一眼可见工具都齐了,最后一节把 EDA 流程、Matplotlib、Seaborn 拼成一次完整的实战——用电商订单数据跑一遍"从清洗到洞察"。