seaborn 简介#

Seaborn 是一个用于在 Python 中制作统计图形的库。它基于 matplotlib 构建,并与 pandas 数据结构紧密集成。

Seaborn 帮助你探索和理解你的数据。它的绘图函数作用于包含整个数据集的数据框和数组,并在内部执行必要的语义映射和统计聚合以生成信息丰富的图表。其面向数据集的声明式 API 让你专注于图表中不同元素的含义,而不是绘制它们的细节。

以下是seaborn能做什么的一个例子:

# Import seaborn
import seaborn as sns

# Apply the default theme
sns.set_theme()

# Load an example dataset
tips = sns.load_dataset("tips")

# Create a visualization
sns.relplot(
    data=tips,
    x="total_bill", y="tip", col="time",
    hue="smoker", style="smoker", size="size",
)
../_images/introduction_1_0.png

这里发生了一些事情。让我们逐一来看:

# Import seaborn
import seaborn as sns

Seaborn 是我们在这个简单示例中唯一需要导入的库。按照惯例,它以简称 sns 导入。

在幕后,seaborn 使用 matplotlib 来绘制其图表。对于交互式工作,建议在 matplotlib 模式 下使用 Jupyter/IPython 接口,否则你需要在想要查看图表时调用 matplotlib.pyplot.show()

# Apply the default theme
sns.set_theme()

这使用了 matplotlib 的 rcParam 系统,并将影响所有 matplotlib 图形的外观,即使你没有使用 seaborn 来制作它们。除了默认主题之外,还有 几种其他选项,你可以独立控制图形的样式和缩放,以便在演示上下文之间快速转换你的工作(例如,制作一个在演讲时投影时字体可读的图形版本)。如果你喜欢 matplotlib 的默认设置或偏好不同的主题,你可以跳过这一步,仍然使用 seaborn 的绘图功能。

# Load an example dataset
tips = sns.load_dataset("tips")

文档中的大多数代码将使用 load_dataset() 函数来快速访问示例数据集。这些数据集没有什么特别之处:它们只是 pandas 数据框,我们可以使用 pandas.read_csv() 加载它们,或者手动构建它们。文档中的大多数示例将使用 pandas 数据框指定数据,但 seaborn 对它接受的 数据结构 非常灵活。

# Create a visualization
sns.relplot(
    data=tips,
    x="total_bill", y="tip", col="time",
    hue="smoker", style="smoker", size="size",
)

此图展示了tips数据集中五个变量之间的关系,使用seaborn函数 relplot() 的一次调用。注意我们只提供了变量的名称及其在图中的角色。与直接使用matplotlib不同,不需要指定颜色值或标记代码等图元素的属性。在幕后,seaborn处理了从数据框中的值到matplotlib理解的参数的转换。这种声明式方法让你专注于想要回答的问题,而不是如何控制matplotlib的细节。

用于统计图表的高级API#

没有一种普遍最佳的数据可视化方法。不同的问题最好通过不同的图表来回答。Seaborn 通过使用一致的数据集导向 API,使得在不同的可视化表示之间切换变得容易。

函数 relplot() 之所以这样命名,是因为它旨在可视化许多不同的统计 关系。虽然散点图通常很有效,但当一个变量代表时间的度量时,用线条表示关系会更好。relplot() 函数有一个方便的 kind 参数,可以让你轻松切换到这种替代表示:

dots = sns.load_dataset("dots")
sns.relplot(
    data=dots, kind="line",
    x="time", y="firing_rate", col="align",
    hue="choice", size="coherence", style="choice",
    facet_kws=dict(sharex=False),
)
../_images/introduction_11_0.png

注意 sizestyle 参数在散点图和线图中是如何使用的,但它们对这两种可视化的影响不同:在散点图中改变标记区域和符号,而在线图中改变线宽和虚线。我们不需要记住这些细节,让我们能够专注于图表的整体结构和我们希望它传达的信息。

统计估计#

通常,我们对一个变量的*平均*值作为其他变量的函数感兴趣。许多seaborn函数将自动执行回答这些问题所需的统计估计:

fmri = sns.load_dataset("fmri")
sns.relplot(
    data=fmri, kind="line",
    x="timepoint", y="signal", col="region",
    hue="event", style="event",
)
../_images/introduction_13_0.png

当估计统计值时,seaborn 将使用自助法(bootstrapping)来计算置信区间,并绘制表示估计不确定性的误差条。

seaborn 中的统计估计超越了描述性统计。例如,可以通过使用 lmplot() 包含线性回归模型(及其不确定性)来增强散点图:

sns.lmplot(data=tips, x="total_bill", y="tip", col="time", hue="smoker")
../_images/introduction_15_0.png

分布式表示#

统计分析需要了解数据集中变量的分布情况。seaborn 函数 displot() 支持多种可视化分布的方法。这些方法包括经典技术如直方图和计算密集型方法如核密度估计:

sns.displot(data=tips, x="total_bill", col="time", kde=True)
../_images/introduction_17_0.png

Seaborn 还尝试推广那些强大但不太为人所知的技术,例如计算并绘制数据的实证累积分布函数:

sns.displot(data=tips, kind="ecdf", x="total_bill", col="time", hue="smoker", rug=True)
../_images/introduction_19_0.png

分类数据的图表#

seaborn 中有几种专门用于可视化分类数据的绘图类型。它们可以通过 catplot() 访问。这些图提供了不同级别的粒度。在最精细的级别上,您可能希望通过绘制“蜂群”图来查看每个观察结果:这是一种散点图,它沿着分类轴调整点的位置,以使它们不重叠:

sns.catplot(data=tips, kind="swarm", x="day", y="total_bill", hue="smoker")
../_images/introduction_21_0.png

或者,你可以使用核密度估计来表示这些点所采样的潜在分布:

sns.catplot(data=tips, kind="violin", x="day", y="total_bill", hue="smoker", split=True)
../_images/introduction_23_0.png

或者,您可以在每个嵌套类别中仅显示平均值及其置信区间:

sns.catplot(data=tips, kind="bar", x="day", y="total_bill", hue="smoker")
../_images/introduction_25_0.png

复杂数据集的多变量视图#

一些 seaborn 函数结合了多种类型的图表,以快速提供数据集的概要信息。其中之一,jointplot(),专注于单一关系。它绘制了两个变量之间的联合分布以及每个变量的边际分布:

penguins = sns.load_dataset("penguins")
sns.jointplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species")
../_images/introduction_27_0.png

另一个是 pairplot(),它提供了一个更广泛的视角:它分别显示了所有成对关系和每个变量的联合分布和边缘分布:

sns.pairplot(data=penguins, hue="species")
../_images/introduction_29_0.png

用于构建图形的低级工具#

这些工具通过结合 axes-level 绘图函数与管理图形布局的对象,将数据集的结构链接到 轴网格 。这两个元素都是公共API的一部分,你可以直接使用它们来创建复杂的图形,只需几行额外的代码:

g = sns.PairGrid(penguins, hue="species", corner=True)
g.map_lower(sns.kdeplot, hue=None, levels=5, color=".2")
g.map_lower(sns.scatterplot, marker="+")
g.map_diag(sns.histplot, element="step", linewidth=0, kde=True)
g.add_legend(frameon=True)
g.legend.set_bbox_to_anchor((.61, .6))
../_images/introduction_31_0.png

固执的默认设置和灵活的自定义#

Seaborn 通过单一函数调用创建完整的图形:在可能的情况下,其函数将自动添加信息轴标签和图例,解释图中的语义映射。

在许多情况下,seaborn 还会根据数据特征为其参数选择默认值。例如,我们迄今为止看到的 颜色映射 使用不同的色调(蓝色、橙色,有时是绿色)来表示分配给 hue 的分类变量的不同级别。当映射数值变量时,某些函数将切换到连续渐变:

sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g"
)
../_images/introduction_33_0.png

当你准备好分享或发布你的作品时,你可能希望对图形进行美化,超越默认设置的效果。Seaborn 提供了多个自定义层级。它定义了多个内置的 主题,这些主题适用于所有图形,其函数具有标准化的参数,可以修改每个图形的语义映射,并且额外的关键字参数会传递给底层的 matplotlib 艺术家,从而提供更多的控制。一旦你创建了一个图形,它的属性可以通过 Seaborn API 进行修改,也可以通过下降到 matplotlib 层进行精细调整:

sns.set_theme(style="ticks", font_scale=1.25)
g = sns.relplot(
    data=penguins,
    x="bill_length_mm", y="bill_depth_mm", hue="body_mass_g",
    palette="crest", marker="x", s=100,
)
g.set_axis_labels("Bill length (mm)", "Bill depth (mm)", labelpad=10)
g.legend.set_title("Body mass (g)")
g.figure.set_size_inches(6.5, 4.5)
g.ax.margins(.15)
g.despine(trim=True)
../_images/introduction_35_0.png

与 matplotlib 的关系#

Seaborn 与 matplotlib 的集成使得你可以在 matplotlib 支持的多种环境中使用它,包括笔记本中的探索性分析、GUI 应用程序中的实时交互,以及多种光栅和矢量格式的存档输出。

虽然你可以仅使用 seaborn 函数进行高效工作,但完全自定义你的图形将需要一些 matplotlib 概念和 API 的知识。对于 seaborn 的新用户来说,学习曲线的一个方面将是知道何时需要下降到 matplotlib 层以实现特定的自定义。另一方面,来自 matplotlib 的用户会发现他们的许多知识是可以转移的。

Matplotlib 拥有全面且强大的 API;几乎图形的任何属性都可以根据您的喜好进行更改。结合 seaborn 的高级界面和 matplotlib 的深度定制性,将使您能够快速探索数据,并创建可以定制为 出版质量 的最终产品。

下一步#

你有几个选择接下来去哪里。你可能首先想学习如何 安装 seaborn 。一旦完成,你可以浏览 示例图库 以更广泛地了解 seaborn 可以生成的图形类型。或者你可以阅读 用户指南和教程 的其余部分,以深入讨论不同的工具及其设计目的。如果你有一个特定的图形想法并想知道如何制作它,你可以查看 API 参考 ,其中记录了每个函数的参数,并展示了多个示例来说明用法。