seaborn.FacetGrid.__init__#

FacetGrid.__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_kwsdict

传递给 matplotlib 子图方法的关键字参数字典。

gridspec_kwsdict

传递给 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

注意每个面中的箱子的宽度如何不同。在每个面上绘制一个单独的图,因此如果绘图函数从数据中推导出任何参数,它们可能不会在各个面之间共享。您可以传递额外的关键字参数来同步它们。但如果可能,使用诸如 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

但是,当 hue 设置在 FacetGrid 上时,会为变量的每个级别绘制一个单独的图。如果绘图函数了解 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