seaborn.FacetGrid#

class seaborn.FacetGrid(data, *, row=None, col=None, hue=None, col_wrap=None, sharex=True, sharey=True, height=3, aspect=1, palette=None, row_order=None, col_order=None, hue_order=None, hue_kws=None, dropna=False, legend_out=True, despine=True, margin_titles=False, xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None)#

用于绘制条件关系的多图网格。

__init__(data, *, row=None, col=None, hue=None, col_wrap=None, sharex=True, sharey=True, height=3, aspect=1, palette=None, row_order=None, col_order=None, hue_order=None, hue_kws=None, dropna=False, legend_out=True, despine=True, margin_titles=False, xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None)#

初始化 matplotlib 图形和 FacetGrid 对象。

此类将数据集映射到排列在行和列网格中的多个轴上,这些轴对应于数据集中的变量的级别。它生成的图通常称为“网格”、“格子”或“小倍数”图形。

它还可以使用hue参数表示第三个变量的级别,该参数以不同的颜色绘制数据集的不同子集。这使用颜色来解决第三维上的元素,但只在彼此之上绘制子集,并且不会像接受hue的轴级别函数那样,为特定可视化定制hue参数。

基本工作流程是使用数据集和用于构建网格的变量初始化FacetGrid对象。然后,可以通过调用FacetGrid.map()FacetGrid.map_dataframe(),将一个或多个绘图函数应用于每个子集。最后,可以使用其他方法调整绘图,例如更改轴标签、使用不同的刻度或添加图例。有关更多信息,请参阅下面的详细代码示例。

警告

当使用 seaborn 函数从数据集推断语义映射时,必须注意在各个方面同步这些映射(例如,通过使用调色板字典定义 hue 映射,或将变量的数据类型设置为 category)。在大多数情况下,最好使用图级函数(例如 relplot()catplot()),而不是直接使用 FacetGrid

有关更多信息,请参见 教程

参数:
dataDataFrame

整洁(“长格式”)数据框,其中每列都是一个变量,每行都是一个观测值。

row, col, hue字符串

定义数据子集的变量,这些子集将在网格中的单独方面上绘制。请参阅 {var}_order 参数以控制此变量的级别顺序。

col_wrap整数

以此宽度“包装”列变量,以便列方面跨越多行。与 row 方面不兼容。

share{x,y}布尔值,“col”或“row”,可选

如果为真,则各个方面将在列之间共享 y 轴,以及/或在行之间共享 x 轴。

height标量

每个方面的“高度”(以英寸为单位)。另请参见: aspect

aspect标量

每个方面的纵横比,因此 aspect * height 给出每个方面的宽度(以英寸为单位)。

palette调色板名称,列表或字典

用于 hue 变量的不同级别的颜色。应该可以被 color_palette() 解释,或是一个将色调级别映射到 matplotlib 颜色的字典。

{row,col,hue}_order列表

分面变量级别的顺序。默认情况下,这将是级别出现在 data 中的顺序,或者如果变量是 pandas 类别,则是类别顺序。

hue_kws参数 -> 值列表映射的字典

插入绘图调用中的其他关键字参数,以使其他绘图属性在色调变量级别之间发生变化(例如散点图中的标记)。

legend_out布尔值

如果为 True,则图的大小将被扩展,并且图例将绘制在图的中心右侧外部。

despine布尔值

从图中删除顶部和右侧脊柱。

margin_titles布尔值

如果为 True,则行变量的标题将绘制在最后一列的右侧。此选项是实验性的,可能不适用于所有情况。

{x, y}lim: 元组

每个方面上每个轴的限制(仅在 share{x, y} 为 True 时才相关)。

subplot_kws字典

传递给 matplotlib subplot(s) 方法的关键字参数字典。

gridspec_kws字典

传递给 matplotlib.gridspec.GridSpec(通过 matplotlib.figure.Figure.subplots())的关键字参数字典。如果 col_wrap 不是 None,则忽略。

另请参见

PairGrid

用于绘制成对关系的子图网格

relplot

将关系图和 FacetGrid 相结合

displot

将分布图和 FacetGrid 相结合

catplot

将分类图和 FacetGrid 相结合

lmplot

将回归图和 FacetGrid 相结合

示例

注意

这些示例使用 seaborn 函数来演示该类的某些高级功能,但在大多数情况下,您将希望使用图级函数(例如 displot()relplot())来制作此处显示的图。

调用构造函数需要一个长格式数据对象。这将初始化网格,但不会在其上绘制任何内容

tips = sns.load_dataset("tips")
sns.FacetGrid(tips)
../_images/FacetGrid_1_0.png

分配列和/或行变量以向图添加更多子图

sns.FacetGrid(tips, col="time", row="sex")
../_images/FacetGrid_3_0.png

要在每个方面上绘制图,请将函数和数据框中一个或多个列的名称传递给 FacetGrid.map()

g = sns.FacetGrid(tips, col="time",  row="sex")
g.map(sns.scatterplot, "total_bill", "tip")
../_images/FacetGrid_5_0.png

FacetGrid.map() 中的变量规范需要位置参数映射,但是如果该函数具有 data 参数并接受命名变量分配,那么您也可以使用 FacetGrid.map_dataframe()

g = sns.FacetGrid(tips, col="time",  row="sex")
g.map_dataframe(sns.histplot, x="total_bill")
../_images/FacetGrid_7_0.png

注意每个方面中的 bin 宽度如何不同。在每个方面上都会绘制一个单独的图,因此如果绘图函数从数据中派生任何参数,则这些参数可能不会在各个方面之间共享。您可以传递额外的关键字参数来同步它们。但是,在可能的情况下,使用类似 displot() 的图级函数将为您处理此簿记工作

g = sns.FacetGrid(tips, col="time", row="sex")
g.map_dataframe(sns.histplot, x="total_bill", binwidth=2, binrange=(0, 60))
../_images/FacetGrid_9_0.png

FacetGrid 构造函数接受一个 hue 参数。设置它将根据另一个变量来条件化数据,并以不同的颜色绘制多个图。在可能的情况下,将跟踪标签信息,以便可以绘制单个图例

g = sns.FacetGrid(tips, col="time", hue="sex")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.add_legend()
../_images/FacetGrid_11_0.png

但是,当在 FacetGrid 上设置 hue 时,将为变量的每个级别绘制一个单独的图。如果绘图函数理解 hue,最好让它处理该逻辑。但是,必须确保每个方面都将使用相同的色调映射。在示例 tips 数据中,sex 列具有类别数据类型,这可以确保这一点。否则,您可能需要使用 hue_order 或类似参数

g = sns.FacetGrid(tips, col="time")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex")
g.add_legend()
../_images/FacetGrid_13_0.png

图的大小和形状使用 heightaspect 参数在每个子图级别指定

g = sns.FacetGrid(tips, col="day", height=3.5, aspect=.65)
g.map(sns.histplot, "total_bill")
../_images/FacetGrid_15_0.png

如果分配给 col 的变量具有多个级别,则可以对其进行“包装”,以便它跨越多行

g = sns.FacetGrid(tips, col="size", height=2.5, col_wrap=3)
g.map(sns.histplot, "total_bill")
../_images/FacetGrid_17_0.png

要在每个方面上添加水平或垂直参考线,请使用 FacetGrid.refline()

g = sns.FacetGrid(tips, col="time", margin_titles=True)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.refline(y=tips["tip"].median())
../_images/FacetGrid_19_0.png

您可以传递自定义函数来绘制,或注释每个方面。您的自定义函数必须使用 matplotlib 状态机界面在“当前”轴上绘制,并且应该捕获其他关键字参数

import matplotlib.pyplot as plt
def annotate(data, **kws):
    n = len(data)
    ax = plt.gca()
    ax.text(.1, .6, f"N = {n}", transform=ax.transAxes)

g = sns.FacetGrid(tips, col="time")
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.map_dataframe(annotate)
../_images/FacetGrid_21_0.png

FacetGrid 对象有一些其他有用的参数和方法来调整图

g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.set_axis_labels("Total bill ($)", "Tip ($)")
g.set_titles(col_template="{col_name} patrons", row_template="{row_name}")
g.set(xlim=(0, 60), ylim=(0, 12), xticks=[10, 30, 50], yticks=[2, 6, 10])
g.tight_layout()
g.savefig("facet_plot.png")
../_images/FacetGrid_23_0.png

您还可以访问底层的 matplotlib 对象以进行进一步调整

g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True, despine=False)
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip")
g.figure.subplots_adjust(wspace=0, hspace=0)
for (row_val, col_val), ax in g.axes_dict.items():
    if row_val == "Lunch" and col_val == "Female":
        ax.set_facecolor(".95")
    else:
        ax.set_facecolor((0, 0, 0, 0))
../_images/FacetGrid_25_0.png

方法

__init__(data, *[, row, col, hue, col_wrap, ...])

初始化 matplotlib 图形和 FacetGrid 对象。

add_legend([legend_data, title, ...])

绘制图例,可能将其放置在轴之外并调整图的大小。

apply(func, *args, **kwargs)

将网格传递给用户提供的函数并返回 self。

despine(**kwargs)

从各个方面删除轴脊柱。

facet_axis(row_i, col_j[, modify_state])

使这些索引标识的轴处于活动状态并返回它。

facet_data()

用于每个方面的名称索引和数据子集的生成器。

map(func, *args, **kwargs)

将绘图函数应用于每个方面的數據子集。

map_dataframe(func, *args, **kwargs)

类似于 .map,但将参数作为字符串传递并将数据插入 kwargs 中。

pipe(func, *args, **kwargs)

将网格传递给用户提供的函数并返回其值。

refline(*[, x, y, color, linestyle])

在每个方面上添加参考线。

savefig(*args, **kwargs)

保存绘图的图像。

set(**kwargs)

设置每个子图 Axes 的属性。

set_axis_labels([x_var, y_var, clear_inner])

设置网格左侧列和底部行的轴标签。

set_titles([template, row_template, ...])

在每个刻面上方或网格边距上绘制标题。

set_xlabels([label, clear_inner])

标记网格底部行的 x 轴。

set_xticklabels([labels, step])

设置网格的 x 轴刻度标签。

set_ylabels([label, clear_inner])

标记网格左侧列的 y 轴。

set_yticklabels([labels])

设置网格左侧列的 y 轴刻度标签。

tick_params([axis])

修改刻度、刻度标签和网格线。

tight_layout(*args, **kwargs)

在排除图例的矩形内调用 fig.tight_layout。

属性

ax

当没有分配刻面变量时,matplotlib.axes.Axes

axes

网格中 matplotlib.axes.Axes 对象的数组。

axes_dict

刻面名称到对应 matplotlib.axes.Axes 的映射。

fig

已弃用:建议使用 figure 属性。

figure

访问网格底层的 matplotlib.figure.Figure 对象。

legend

如果存在,matplotlib.legend.Legend 对象。