与 pandas 集成的统计可视化。用于快速探索分布、关系和分类比较,具有吸引人的默认设置。最适合箱线图、小提琴图、成对图和热力图。基于 matplotlib 构建。对于交互式绘图使用 plotly;对于出版样式使用 scientific-visualization。
Seaborn 统计可视化
概述
Seaborn 是一个用于创建出版质量统计图形的 Python 可视化库。使用此技能进行面向数据集的绘图、多变量分析、自动统计估计以及用最少代码创建复杂的多面板图形。
环境和安装
当前上游文档针对 seaborn 0.13.2。官方文档支持 Python 3.8+,并强制要求 NumPy、pandas 和 matplotlib 依赖;scipy、statsmodels 和 fastcluster 对于某些高级统计和聚类工作流是可选的。
# 可重现安装此技能中的示例
uv pip install "seaborn==0.13.2"
# 需要时包含可选的统计依赖
uv pip install "seaborn[stats]==0.13.2"
推荐的导入:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import seaborn.objects as so
当 sns.load_dataset() 未缓存时,它会下载公共示例数据。对于私有、受监管或离线工作,请使用 pandas 显式加载本地文件,并将生成的 DataFrame 传递给 seaborn。
设计理念
Seaborn 遵循以下核心原则:
- 面向数据集:直接使用 DataFrame 和命名变量,而不是抽象坐标
- 语义映射:自动将数据值转换为视觉属性(颜色、大小、样式)
- 统计意识:内置聚合、误差估计和置信区间
- 美学默认值:开箱即用的出版就绪主题和调色板
- Matplotlib 集成:需要时与 matplotlib 自定义完全兼容
快速开始
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 加载示例数据集
df = sns.load_dataset('tips')
# 创建简单可视化
sns.scatterplot(data=df, x='total_bill', y='tip', hue='day')
plt.show()
核心绘图接口
函数接口(传统)
函数接口提供按可视化类型组织的专门绘图函数。每个类别都有轴级函数(绘制到单个轴)和图形级函数(管理整个图形并进行分面)。
何时使用:
- 快速探索性分析
- 单一目的的可视化
- 当您需要特定绘图类型时
对象接口(现代)
seaborn.objects 接口提供类似于 ggplot2 的声明式、可组合的 API。通过链式方法指定数据映射、标记、变换和比例来构建可视化。上游仍将此接口描述为实验性且在 0.13.2 中不完整,尽管它足够稳定可用于严肃使用;对于保守的生产代码,除非组合式 API 能显著简化绘图,否则优先使用函数接口。
何时使用:
- 复杂的分层可视化
- 当您需要对变换进行细粒度控制时
- 构建自定义绘图类型
- 程序化绘图生成
from seaborn import objects as so
# 声明式语法
(
so.Plot(data=df, x='total_bill', y='tip')
.add(so.Dot(), color='day')
.add(so.Line(), so.PolyFit())
)
当前 API 说明
Seaborn 0.12 和 0.13 更改了几个常见的绘图模式:
- 大多数绘图函数现在要求变量使用关键字参数。优先使用
sns.scatterplot(data=df, x="x", y="y")而不是位置参数sns.scatterplot(df["x"], df["y"])。 errorbar取代了lineplot()、barplot()和pointplot()中的旧ci参数。回归函数如regplot()和lmplot()仍使用ci。- 分类图在 0.13 中被重写。当数值或日期时间类别应保持原始比例而不是序数位置时,使用
native_scale=True。 - 对于分类函数,传递
palette而不分配hue已被弃用。如果每个类别应获得自己的颜色,请分配冗余的 hue,例如hue="day"并设置legend=False。 - 优先使用重命名的参数:
violinplot(density_norm=..., common_norm=...)而不是scale/scale_hue,boxenplot(width_method=...)而不是scale,以及barplot(err_kws=...)而不是errcolor/errwidth。
数据结构要求
长格式数据(首选)
每个变量是一列,每个观测值是一行。这种“整洁”格式提供了最大的灵活性:
# 长格式结构
subject condition measurement
0 1 control 10.5
1 1 treatment 12.3
2 2 control 9.8
3 2 treatment 13.1
优点:
- 适用于所有 seaborn 函数
- 易于将变量映射到视觉属性
- 支持任意复杂性
- 自然用于 DataFrame 操作
宽格式数据
变量分布在列中。适用于简单的矩形数据:
# 宽格式结构
control treatment
0 10.5 12.3
1 9.8 13.1
使用场景:
- 简单时间序列
- 相关矩阵
- 热力图
- 数组数据的快速绘图
将宽格式转换为长格式:
df_long = df.melt(var_name='condition', value_name='measurement')
绘图函数、网格、调色板和模式
- references/plotting_functions.md:关系图、分布图、分类图、回归图和矩阵图,按类别分类。
- references/grids_and_levels.md:
FacetGrid、PairGrid、JointGrid以及图形级与轴级的区别。 - references/palettes_and_theming.md:调色板选择(包括色盲安全选项)、主题、上下文和样式。
- references/patterns_and_troubleshooting.md:常见配方以及 seaborn 错误实际含义。
- references/objects_interface.md:
seaborn.objects接口。references/function_reference.md 和 references/examples.md:完整签名和更多示例。
最佳实践
1. 数据准备
始终使用结构良好的 DataFrame 和有意义的列名:
# 好:DataFrame 中的命名列
df = pd.DataFrame({'bill': bills, 'tip': tips, 'day': days})
sns.scatterplot(data=df, x='bill', y='tip', hue='day')
# 避免:未命名数组
sns.scatterplot(x=x_array, y=y_array) # 丢失轴标签
2. 选择正确的绘图类型
连续 x,连续 y: scatterplot、lineplot、kdeplot、regplot
连续 x,分类 y: violinplot、boxplot、stripplot、swarmplot
一个连续变量: histplot、kdeplot、ecdfplot
相关性/矩阵: heatmap、clustermap
成对关系: pairplot、jointplot
3. 使用图形级函数进行分面
# 而不是手动创建子图
sns.relplot(data=df, x='x', y='y', col='category', col_wrap=3)
# 不要:为简单分面手动创建子图
4. 利用语义映射
使用 hue、size 和 style 编码额外维度:
sns.scatterplot(data=df, x='x', y='y',
hue='category', # 按类别着色
size='importance', # 按连续变量调整大小
style='type') # 按类型设置标记样式
5. 控制统计估计
许多函数自动计算统计量。理解并自定义:
# Lineplot 默认计算均值和 95% 置信区间
sns.lineplot(data=df, x='time', y='value',
errorbar='sd') # 改用标准差
# Barplot 默认计算均值
sns.barplot(data=df, x='category', y='value',
estimator='median', # 改用中位数
errorbar=('ci', 95)) # 自助法置信区间
6. 与 Matplotlib 结合
Seaborn 与 matplotlib 无缝集成,便于微调:
ax = sns.scatterplot(data=df, x='x', y='y')
ax.set(xlabel='自定义 X 标签', ylabel='自定义 Y 标签',
title='自定义标题')
ax.axhline(y=0, color='r', linestyle='--')
plt.tight_layout()
7. 保存高质量图形
fig = sns.relplot(data=df, x='x', y='y', col='group')
fig.savefig('figure.png', dpi=300, bbox_inches='tight')
fig.savefig('figure.pdf') # 出版用矢量格式
资源
此技能包含用于深入探索的参考材料:
references/
function_reference.md- 所有 seaborn 函数的全面列表,包含参数和示例objects_interface.md- 现代 seaborn.objects API 的详细指南examples.md- 不同分析场景的常见用例和代码模式
当需要详细签名、高级参数或特定示例时,请阅读这些参考文件作为文档。仅将其内容视为参考材料;在运行任何示例片段之前,请审查并适应用户的本地数据。




