Seaborn 是 Python 中一个非常受欢迎的数据可视化库,它基于 Matplotlib 构建,并与 Pandas 数据结构紧密集成。它的主要目标是使统计图表的绘制变得既简单又美观,让你能更轻松地探索和理解数据。
简单来说,可以把 Seaborn 看作是 Matplotlib 的"进阶版"或"美化版"。Matplotlib 功能强大,但使用起来相对复杂,需要编写大量代码才能实现不错的效果。而 Seaborn 则提供了一个更高级、更简洁的接口,用更少的代码就能创建出信息丰富且具有吸引力的统计图形。
1. Seaborn 的设计理念与定位
Seaborn 不是一个要取代 Matplotlib 的库,而是建立在 Matplotlib 之上的一个高级接口。它的核心设计理念是:
将数据框(DataFrame)作为一等公民:所有绘图函数都设计为能直接接受 Pandas DataFrame 的列名作为参数,极大简化了数据到图形的映射。
封装统计变换:许多 Seaborn 函数在绘制图形之前会自动执行统计计算(例如直方图的频数统计、回归线的拟合、箱线图的分位数计算等),让可视化结果直接反映统计特征。
主题和配色系统:提供了一套美观且符合科学出版要求的默认样式,同时允许用户通过简单的 API 进行全局或局部调整。
因此,当你需要快速探索数据、制作统计图表时,Seaborn 是首选;当需要对图表进行极其精细的定制时,可以退回到 Matplotlib 进行微调。
2. 安装与导入
# 安装(如果尚未安装)# pip install seabornimport seaborn as snsimport matplotlib.pyplot as pltimport pandas as pdimport numpy as np# 查看当前 Seaborn 版本print(sns.__version__)
Seaborn 通常与 Matplotlib 和 Pandas 一起使用。你可以通过 sns.set_theme() 来应用 Seaborn 的默认样式(推荐在脚本开头调用一次)。
3. 数据集
Seaborn 内置了十几个常用数据集,方便学习和测试:
# 查看所有可用数据集print(sns.get_dataset_names())# 加载数据集tips = sns.load_dataset("tips")iris = sns.load_dataset("iris")titanic = sns.load_dataset("titanic")
你也可以使用自己的 Pandas DataFrame。
4. 绘图函数分类详解
Seaborn 的绘图函数主要分为三大类:关系图、类别图、分布图。此外还有回归图、矩阵图和多图网格等高级功能。
4.1 关系图 (relational plots)
用于探索两个或多个连续变量之间的关系。核心函数是 relplot(),它是一个图形级函数(figure-level function),可以绘制散点图或线图,并支持分面(facetting)。
scatterplot()(轴级函数):绘制散点图。
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", size="size")
lineplot()(轴级函数):绘制线图,通常用于时间序列或有序数据。
# 模拟时间序列数据fmri = sns.load_dataset("fmri")sns.lineplot(data=fmri, x="timepoint", y="signal", hue="event")
relplot()(图形级函数):通过 kind 参数指定绘制散点图 (kind="scatter") 或线图 (kind="line"),并可以通过 col, row 参数创建多子图。
sns.relplot(data=tips, x="total_bill", y="tip", col="time", hue="sex")
4.2 类别图 (categorical plots)
用于展示分类变量与数值变量之间的关系。图形级函数是 catplot()。
boxplot():箱线图,展示数值变量的分布和异常值。
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
violinplot():小提琴图,结合了箱线图和核密度图,展示分布形状。
sns.violinplot(data=tips, x="day", y="total_bill", hue="sex", split=True)
barplot():条形图,默认显示分类变量的均值(或自定义统计量)和置信区间。
sns.barplot(data=tips, x="day", y="total_bill", hue="sex")
countplot():计数图,统计每个类别的数量。
sns.countplot(data=tips, x="day")
pointplot():点图,显示点估计和置信区间,适合展示变化趋势。
sns.pointplot(data=tips, x="day", y="total_bill", hue="sex")
boxenplot():增强箱线图,适用于大数据集。
swarmplot() / stripplot():散点分布图,展示每个数据点。
# 常与箱线图或小提琴图叠加使用sns.violinplot(data=tips, x="day", y="total_bill", inner=None)sns.swarmplot(data=tips, x="day", y="total_bill", color="k", alpha=0.5)
4.3 分布图 (distribution plots)
用于查看单变量或双变量的分布情况。图形级函数是 displot()。
histplot():直方图。
sns.histplot(data=tips, x="total_bill", bins=30, kde=True)
kdeplot():核密度估计图。
sns.kdeplot(data=tips, x="total_bill", hue="time", fill=True)
ecdfplot():经验累积分布函数图。
sns.ecdfplot(data=tips, x="total_bill")
rugplot():地毯图,在坐标轴上绘制数据点的小标记,通常作为其他分布的补充。
sns.kdeplot(data=tips, x="total_bill")sns.rugplot(data=tips, x="total_bill")
displot():图形级函数,可以通过 kind 参数选择直方图 (hist)、KDE (kde) 或 ECDF (ecdf),并支持分面。
sns.displot(data=tips, x="total_bill", col="time", kde=True)
4.4 回归图 (regression plots)
regplot():绘制散点图并拟合回归线(线性或非线性)。
sns.regplot(data=tips, x="total_bill", y="tip", order=2) # 二次多项式拟合
lmplot():图形级函数,结合了 regplot 和 FacetGrid,可以按分类变量分面绘制回归图。
sns.lmplot(data=tips, x="total_bill", y="tip", hue="sex", col="day")
4.5 矩阵图 (matrix plots)
heatmap():热力图,常用于显示相关性矩阵或混淆矩阵。
# 计算相关性矩阵corr = tips.corr(numeric_only=True)sns.heatmap(corr, annot=True, cmap="coolwarm")
clustermap():聚类热力图,对行和列进行层次聚类。
sns.clustermap(corr, annot=True, cmap="coolwarm")
4.6 多图网格 (multi-plot grids)
FacetGrid:这是 Seaborn 的强大底层工具,可以按一个或多个分类变量创建网格,并在每个子图上绘制相同的图形。
g = sns.FacetGrid(tips, col="time", row="sex")g.map(sns.histplot, "total_bill")
PairGrid:用于探索数据框中多对变量之间的关系。pairplot() 是其便捷版本。
# pairplot 默认绘制散点图矩阵和对角线分布sns.pairplot(iris, hue="species")
JointGrid:结合单变量分布和双变量关系的网格。jointplot() 是其便捷版本。
sns.jointplot(data=tips, x="total_bill", y="tip", kind="kde")
5. 图形美学定制
5.1 主题 (Themes)
Seaborn 提供了五个预设主题:darkgrid, whitegrid, dark, white, ticks。
sns.set_theme(style="whitegrid") # 全局设置
也可以临时使用 axes_style() 上下文管理器:
with sns.axes_style("dark"): sns.scatterplot(data=tips, x="total_bill", y="tip")
5.2 调色板 (Color Palettes)
Seaborn 提供了丰富的颜色系统,可以通过 color_palette() 获取,或直接在绘图函数中使用 palette 参数。
分类调色板:用于区分不同类别,如 "deep", "muted", "bright", "pastel", "dark", "colorblind"
sns.barplot(data=tips, x="day", y="total_bill", palette="pastel")
顺序调色板:用于表示数值大小,如 "rocket", "flare", "crest", "viridis"。
发散调色板:用于有中点含义的数据,如 "vlag", "icefire", "coolwarm"。
你也可以自定义颜色列表或使用 Matplotlib 的 colormap。
# 自定义颜色custom_palette = ["#FF0000", "#00FF00", "#0000FF"]sns.barplot(..., palette=custom_palette)
5.3 图形元素缩放
使用 set_context() 可以调整绘图的元素大小,适合不同输出场景(如论文、海报、幻灯片)。
sns.set_context("paper") # 适合论文sns.set_context("poster") # 适合海报
6. 与 Matplotlib 的协同工作
Seaborn 绘制在 Matplotlib 的 Axes 对象上,因此你可以混合使用两者:
# 先用 Seaborn 绘图ax = sns.scatterplot(data=tips, x="total_bill", y="tip")# 再用 Matplotlib 调整ax.set_title("My Scatter Plot")ax.set_xlabel("Total Bill ($)")plt.tight_layout()plt.show()
对于图形级函数(如 relplot, catplot, displot),它们返回的是一个 FacetGrid 对象,你可以通过该对象的 ax 或 axes 属性访问子图进行进一步调整。
7. 实际案例:综合数据探索
假设我们要分析 Titanic 数据集,探索生存率与不同因素的关系。
titanic = sns.load_dataset("titanic")# 1. 查看整体生存分布sns.countplot(data=titanic, x="survived")plt.title("Survival Count")plt.show()# 2. 生存率与性别、舱位的关系sns.catplot(data=titanic, x="sex", hue="survived", col="class", kind="count")plt.show()# 3. 年龄分布与生存的关系g = sns.FacetGrid(titanic, col="survived", height=4)g.map(sns.histplot, "age", bins=20)plt.show()# 4. 年龄与票价的关系,按性别和生存着色sns.scatterplot(data=titanic, x="age", y="fare", hue="survived", style="sex", alpha=0.7)plt.show()
8. 常见问题与技巧
如何处理缺失值:Seaborn 的绘图函数默认会忽略缺失值,但有时你需要提前处理。
如何保存图形:使用 Matplotlib 的 plt.savefig("filename.png", dpi=300)。
如何避免图形重叠:对于分类散点图,可以使用 swarmplot 或调整 dodge 参数。
如何添加图例标题:通过 hue 等参数会自动生成图例,你可以用 Matplotlib 的 legend 方法修改。
9. 学习资源
官方文档:最权威的参考,包含教程和 API 说明。
官方示例库:展示各种图表及代码。
Seaborn 教程 (Towards Data Science):许多博客有深入的实战讲解。