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
,则忽略。
另请参见
示例
调用构造函数需要一个长格式数据对象。这会初始化网格,但不会在其上绘制任何内容
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")
注意每个面中的箱子的宽度如何不同。在每个面上绘制一个单独的图,因此如果绘图函数从数据中推导出任何参数,它们可能不会在各个面之间共享。您可以传递额外的关键字参数来同步它们。但如果可能,使用诸如
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()
但是,当
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()
使用
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))