Seaborn教程 - 功能概述
该文件的翻译内容还没有进行仔细的检测。
Seaborn绘图功能概述
你与seaborn的大多数互动都将通过一组绘图功能进行。本教程后面的章节将探讨每个功能提供的具体功能。本章将从高层介绍您将遇到的不同类型的功能。
类似任务的类似功能 - Similar functions for similar tasks
seaborn命名空间是平面的;所有功能都可以在顶级访问。但代码本身是分层结构的,具有通过不同方式实现类似可视化目标的功能模块。大多数文档都是围绕这些模块构建的:您会遇到诸如“关系型”、“分布式”和“分类型”之类的名称。
例如,分布模块(distributions module)定义了专门用于表示数据点分布的函数。这包括熟悉的方法,如直方图:
penguins = sns.load_dataset("penguins") |
除了类似但可能不太熟悉的选项,如核密度估计:
sns.kdeplot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack") #核密度估计 |
模块中的函数共享许多底层代码,并提供库的其他组件中可能不存在的类似功能(例如上面示例中的multiple=“stack”
)。它们的设计是为了在探索数据集时方便在不同的视觉表示之间切换,因为不同的表示通常具有互补的优势和劣势。
图形级别与轴级别函数 - Figure-level vs. axes-level functions
除了不同的模块外,还有一个跨领域的seaborn函数分类,即“轴级”或“图形级”。上面的示例是轴级别(axes-level)的函数。它们将数据绘制到单个matplotlib.pyplot.Axes
对象上,该对象是函数的返回值。
相比之下,图形级(figure-level)函数通过管理图形的seaborn对象(通常是FacetGrid)与matplotlib进行接口。每个模块都有一个图形级函数,它为其各种轴级函数提供了一个统一的接口。该组织看起来有点像:
例如,displot()
是分布模块的图形级别函数。它的默认行为是在幕后使用与histplot()
相同的代码绘制直方图:
sns.displot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack") |
要使用与kdeplot()
相同的代码绘制内核密度图,请使用kind
参数进行选择:
sns.displot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack", kind="kde") |
您会注意到图形级别的绘图看起来大多与轴级别的绘图相似,但也有一些不同。值得注意的是,图例被置于图之外。它们的形状也略有不同(稍后将详细介绍)。
图形级函数提供的最有用的功能是,它们可以轻松创建具有多个子图形的图形。例如,我们可以通过绘制图中各列的分布来“分面”它们,而不是将三种分布叠加在同一轴上:
sns.displot(data=penguins, x="flipper_length_mm", hue="species", col="species") |
图形级别的函数包装其轴级别的对应函数,并将特定于种类的关键字参数(如直方图的bin大小)传递给底层函数。这意味着它们同样灵活,但也有一个缺点:特定类型的参数不会出现在函数签名或文档字符串中。它们的一些功能可能不太容易被发现,在了解如何实现特定目标之前,您可能需要查看文档的两个不同页面。
轴级函数生成独立的绘图 - Axes-level functions make self-contained plots
轴级函数的编写方式类似于matplotlib函数的插入式替换。当它们自动添加轴标签和图例时,它们不会修改绘制到的轴之外的任何内容。这意味着它们可以被组合成任意复杂的matplotlib图形,并具有可预测的结果。
轴级函数在内部调用matplotlib.pyplot.gca()
,该函数挂接到matplotlib机器状态接口,以便在“当前活动”轴上绘制图形。但它们还接受ax=
参数,该参数与面向对象接口集成,并允许您指定每个绘图的确切位置:
fig, axs = plt.subplots(1, 2, figsize=(8, 4), gridspec_kw=dict(width_ratios=[4, 3])) |
图形级别的函数拥有自己的图形 - Figure-level functions own their figure
相比之下,图形级别的函数不能(容易地)与其他绘图组合在一起。根据设计,他们“拥有”自己的图形,包括其初始化,因此没有使用图形级函数在现有轴上绘制绘图的概念。此约束允许图形级别的函数实现诸如将图例置于绘图之外之类的功能。
尽管如此,通过访问它们返回的对象上的matplotlib轴并以这种方式将其他元素添加到绘图中,可以超越图形级函数所提供的功能:
tips = sns.load_dataset("tips") |
从图形级别函数自定义绘图 - Customizing plots from a figure-level function
图形级别的函数返回一个FacetGrid
实例,它有一些方法可以自定义绘图的属性,这种方法对于子绘图组织来说是“智能的”。例如,可以使用一行代码更改外部轴上的标签:
g = sns.relplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", col="sex") |
虽然很方便,但这确实增加了一点额外的复杂性,因为您需要记住,此方法不是matplotlib API的一部分,仅在使用图形级函数时才存在。
指定图形大小 - Specifying figure sizes
要增加或减少matplotlib绘图的大小,可以在设置绘图时在全局rcParams中设置整个图形的宽度和高度(例如,使用 matplotlib.pyplot.subplots()
的figsize
参数),也可以通过调用图形对象上的方法(例如,matplotlib.Figure.set_size_inches()
)。在seaborn中使用轴级函数时,同样的规则也适用:绘图的大小取决于它所属图形的大小以及该图形中的轴布局。
使用图形级别函数时,有几个关键区别。首先,函数本身有控制图形大小的参数(尽管这些实际上是管理图形的底层 FacetGrid
的参数)。其次,这些参数,高度(height)和纵横比(aspect),参数化的大小与matplotlib中的宽度和高度参数化略有不同(使用seaborn参数,width = height * aspect
)。最重要的是,这些参数对应于每个子图形的大小,而不是整个图形的大小。
为了说明这些方法之间的区别,下面是带有一个子图的matplotlib.pyplot.subplots()
的默认输出:
f, ax = plt.subplots() |
具有多个列的图形将具有相同的总体尺寸,但轴将被水平挤压以适应空间:
f, ax = plt.subplots(1, 2, sharey=True) |
相比之下,由图形级别函数创建的绘图将是正方形的。为了演示这一点,让我们直接使用FacetGrid设置一个空的绘图。这种情况发生在 relplot()
, displot()
, or catplot()
:
g = sns.FacetGrid(penguins) |
当添加额外的列时,图形本身会变得更宽,因此其子图形具有相同的大小和形状:
g = sns.FacetGrid(penguins, col="sex") |
您可以调整每个子地块的大小和形状,而无需考虑图中的行和列总数:
g = sns.FacetGrid(penguins, col="sex", height=3.5, aspect=.75) |
这样做的结果是,您可以在不停地思考如何调整总体型的情况下分配面部变量。缺点是,当你确实想更改图形大小时,你需要记住,它们的工作方式与matplotlib中的有所不同。
图形级函数的相对优点 - Relative merits of figure-level functions
以下是我们上面讨论过的利弊总结:
Advantages - 优点 | Drawbacks - 缺点 |
---|---|
Easy faceting by data variables - 通过数据变量轻松进行表面处理 | Many parameters not in function signature - 许多参数不在函数签名中 |
Legend outside of plot by default - 默认情况下图例位于绘图之外 | Cannot be part of a larger matplotlib figure - 不能是较大matplotlib图形的一部分 |
Easy figure-level customization - 轻松的图形级定制 | Different API from matplotlib - 与matplotlib不同的API |
Different figure size parameterization - 不同图形大小参数化 | Different figure size parameterization - 不同图形大小参数化 |
总的来说,图形级函数增加了一些额外的复杂性,这可能会让初学者更加困惑,但它们独特的功能赋予了它们额外的功能。教程文档主要使用图形级别的函数,因为它们会生成稍微干净的绘图,我们通常建议大多数应用程序使用它们。它们不是一个好选择的一种情况是,当你需要制作一个复杂、独立的人物,组成多种不同的情节时。在这一点上,建议直接使用matplotlib设置图形,并使用轴级函数填充各个组件。
组合数据的多个视图 - Combining multiple views on the data
seaborn中的两个重要绘图函数不能完全符合上述分类方案。这些函数jointplot()
和pairplot()
使用来自不同模块的多种绘图来在单个图形中表示数据集的多个方面。这两种绘图都是图形级别的函数,默认情况下都会创建具有多个子图形的图形。但它们使用不同的对象来管理图形:分别是JointGrid
和PairGrid
。
jointplot()
绘制两个变量的关系或联合分布,同时添加分别显示每个变量的单变量分布的边缘轴:
sns.jointplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species") |
pairplot()
类似——它结合了联合视图和边缘视图——但它不是专注于单一关系,而是同时可视化变量的每一个成对组合:
sns.pairplot(data=penguins, hue="species") |
在幕后,这些函数使用的是您已经遇到的轴级函数(scatterplot()
和kdeplot()
),它们还有一个kind
参数,可以让您快速切换不同的表示:
sns.jointplot(data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species", kind="hist") |