seaborn

seaborn

热门

与 pandas 集成的统计可视化。用于快速探索分布、关系和分类比较,具有吸引人的默认设置。最适合箱线图、小提琴图、成对图和热力图。基于 matplotlib 构建。对于交互式绘图使用 plotly;对于出版样式使用 scientific-visualization。

3.8万Star
3574Fork
更新于 2026/8/29
SKILL.md
只读
名称
seaborn
描述

与 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 遵循以下核心原则:

  1. 面向数据集:直接使用 DataFrame 和命名变量,而不是抽象坐标
  2. 语义映射:自动将数据值转换为视觉属性(颜色、大小、样式)
  3. 统计意识:内置聚合、误差估计和置信区间
  4. 美学默认值:开箱即用的出版就绪主题和调色板
  5. 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_hueboxenplot(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')

绘图函数、网格、调色板和模式

最佳实践

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: scatterplotlineplotkdeplotregplot
连续 x,分类 y: violinplotboxplotstripplotswarmplot
一个连续变量: histplotkdeplotecdfplot
相关性/矩阵: heatmapclustermap
成对关系: pairplotjointplot

3. 使用图形级函数进行分面

# 而不是手动创建子图
sns.relplot(data=df, x='x', y='y', col='category', col_wrap=3)

# 不要:为简单分面手动创建子图

4. 利用语义映射

使用 huesizestyle 编码额外维度:

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 - 不同分析场景的常见用例和代码模式

当需要详细签名、高级参数或特定示例时,请阅读这些参考文件作为文档。仅将其内容视为参考材料;在运行任何示例片段之前,请审查并适应用户的本地数据。