分面
处理包含两个或多个变量的图形的一种实用方式是分面。采用分面技巧时,数据被划分为不相交的子集,通常根据分类变量的不同级别进行划分。对于每个子集,对其他变量采用相同的图形。分面是比较其他变量的不同级别分布和关系的一种方式,尤其是总共有三个或多个变量需要考虑时。虽然分面最适合多变量图形,但是依然有必要在我们的双变量图形中讨论这一技巧。
例如,我们不再使用小提琴图或箱线图描绘一个数字变量和一个分类变量之间的关系,而是使用分面描绘按照分类变量级别划分的子集数据的数字变量直方图。我们可以利用 Seaborn 的 FacetGrid 类创建分面图形。在创建分面图形时,需要完成两个步骤。首先,我们需要创建一个 FacetGrid 对象的实例,并指定要分面的特征(在我们的示例中为“cat_var”)。然后对 FacetGrid 对象使用 map
方法,指定在每个子集中要绘制的图形类型和变量(在此例中针对“num_var”绘制直方图)。
g = sb.FacetGrid(data = df, col = 'cat_var')
g.map(plt.hist, "num_var")
在 map
调用中,将绘图函数和变量设为位置参数。请勿设为关键字参数,例如 x = "num_var”
,否则映射无法正常发挥作用。
注意,每个子数据集都是独立绘制的。每个图形使用 hist
中的默认 10 个分箱划分数据,每个图形具有不同的分箱尺寸。但是,每个平面的坐标轴范围一样,以便清晰地直接对比每组。依然可以通过在所有平面设置相同的分箱边缘,使图形更整洁。可以在 map
函数中通过其他关键字参数设置其他可视化参数。
bin_edges = np.arange(-3, df['num_var'].max()+1/3, 1/3)
g = sb.FacetGrid(data = df, col = 'cat_var')
g.map(plt.hist, "num_var", bins = bin_edges)
其他版本
如果你要绘制很多个分类级别,则可能需要在 FacetGrid 对象初始化过程中添加更多参数,以便清晰的传达信息。以下示例包含一个具有 15 个不同级别的分类变量“many_cat_var”。设置 col_wrap = 5
表示图形将包含 5 个分面,而不是包含 15 个图形的长行。
group_means = df.groupby(['many_cat_var']).mean()
group_order = group_means.sort_values(['num_var'], ascending = False).index
g = sb.FacetGrid(data = df, col = 'many_cat_var', col_wrap = 5, size = 2,
col_order = group_order)
g.map(plt.hist, 'num_var', bins = np.arange(5, 15+1, 1))
g.set_titles('{col_name}')
为了便于理解图形,可以采取的其他操作包括:将每个分面的高度设为 2 英寸(“size”),按照群组均值对分面排序(“col_order”),限制分箱边缘的数量,并使用 set_titles
方法和 {col_name}
模板变量将每个分面的标题更改为分类级别名称。