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
,则忽略。
另请参见
示例
调用构造函数需要一个长格式数据对象。这将初始化网格,但不会在其上绘制任何内容
tips = sns.load_dataset("tips") sns.FacetGrid(tips)
分配列和/或行变量以向图添加更多子图
sns.FacetGrid(tips, col="time", row="sex")
要在每个方面上绘制图,请将函数和数据框中一个或多个列的名称传递给
FacetGrid.map()
g = sns.FacetGrid(tips, col="time", row="sex") g.map(sns.scatterplot, "total_bill", "tip")
FacetGrid.map()
中的变量规范需要位置参数映射,但是如果该函数具有data
参数并接受命名变量分配,那么您也可以使用FacetGrid.map_dataframe()
g = sns.FacetGrid(tips, col="time", row="sex") g.map_dataframe(sns.histplot, x="total_bill")
注意每个方面中的 bin 宽度如何不同。在每个方面上都会绘制一个单独的图,因此如果绘图函数从数据中派生任何参数,则这些参数可能不会在各个方面之间共享。您可以传递额外的关键字参数来同步它们。但是,在可能的情况下,使用类似
displot()
的图级函数将为您处理此簿记工作g = sns.FacetGrid(tips, col="time", row="sex") g.map_dataframe(sns.histplot, x="total_bill", binwidth=2, binrange=(0, 60))
FacetGrid
构造函数接受一个hue
参数。设置它将根据另一个变量来条件化数据,并以不同的颜色绘制多个图。在可能的情况下,将跟踪标签信息,以便可以绘制单个图例g = sns.FacetGrid(tips, col="time", hue="sex") g.map_dataframe(sns.scatterplot, x="total_bill", y="tip") g.add_legend()
但是,当在
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()
图的大小和形状使用
height
和aspect
参数在每个子图级别指定g = sns.FacetGrid(tips, col="day", height=3.5, aspect=.65) g.map(sns.histplot, "total_bill")
如果分配给
col
的变量具有多个级别,则可以对其进行“包装”,以便它跨越多行g = sns.FacetGrid(tips, col="size", height=2.5, col_wrap=3) g.map(sns.histplot, "total_bill")
要在每个方面上添加水平或垂直参考线,请使用
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())
您可以传递自定义函数来绘制,或注释每个方面。您的自定义函数必须使用 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)
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")
您还可以访问底层的 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))
方法
__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])使这些索引标识的轴处于活动状态并返回它。
用于每个方面的名称索引和数据子集的生成器。
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
对象。