在探索中等维数据时,一种有用的方法是在数据集的不同子集上绘制同一图的多个实例。这种技术有时被称为“格子”或“格子”绘图,它与“小倍数”的概念有关。它允许查看者快速提取有关复杂数据的大量信息。Matplotlib为制作多轴数字提供了很好的支持; seaborn构建于此之上,可直接将绘图结构链接到数据集的结构。要使用这些功能,您的数据必须位于Pandas DataFrame中,并且必须采用Hadley Whickam称之为“整洁”数据的形式。简而言之,这意味着您的数据框应该构造成每列都是一个变量,每一行都是一个观察点。对于高级用途,您可以直接使用本教程本部分中讨论的对象,这将提供最大的灵活性。有些seaborn功能(例如lmplot(),catplot()和pairplot())也使用他们在幕后。与“Axes-level”的其他seaborn函数不同,并且在Axes没有操纵图形的情况下绘制到特定的(可能已经存在的)matplotlib上,这些更高级别的函数在被调用时创建一个figer,并且通常对它的设置方式更加
严格。在某些情况下,这些函数或它们所依赖的类的构造函数的参数将提供不同的接口属性,如图形大小,如在lmplot()您可以在其中设置每个面的高度和纵横比,而不是图的整体尺寸。但是,任何使用这些对象之一的函数在绘图后都会返回它,并且大多数这些对象都有方便的方法来更改绘图的方式,通常以更抽象和简单的方式。
FacetGrid当您想要在数据集的子集中分别可视化变量的分布或多个变量之间的关系时,该类非常有用。一个FacetGrid可以与多达三个维度可以得出:row,col,和hue。前两个与得到的轴阵列有明显的对应关系; 将色调变量视为沿深度轴的第三个维度,其中不同的级别用不同的颜色绘制。通过使用FacetGrid数据框初始化对象以及将形成网格的行,列或色调维度的变量名称来使用该类。这些变量应该是分类的或离散的,然后变量的每个级别的数据将用于沿该轴的小平面。例如,假设我们想要检查tips数据集中午餐和晚餐之间的差异, 此外,每个的relplot(),catplot()以及lmplot()在内部使用这些对象,并且它们返回的对象时,他们完成,使得其可以用于进一步调整。
基本工作流程是FacetGrid
使用数据集和用于构造网格的变量初始化对象。然后,可以通过调用FacetGrid.map()
或将一个或多个绘图函数应用于每个子集 FacetGrid.map_dataframe()
。最后,可以使用其他方法调整绘图,以执行更改轴标签,使用不同刻度或添加图例等操作
当使用从数据集推断语义映射的seaborn函数时,必须注意在各个方面之间同步这些映射。在大多数情况下,使用图形级别功能(例如relplot()
或catplot()
)比 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=True, legend_out=True, despine=True, margin_titles=False, xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)
Parameters: | data : DataFrame
row, col, hue : strings
col_wrap : int, optional
share{x,y} : bool, ‘col’, or ‘row’ optional
height : scalar, optional
aspect : scalar, optional
palette : palette name, list, or dict, optional
{row,col,hue}_order : lists, optional
hue_kws : dictionary of param -> list of values mapping
legend_out : bool, optional
despine : boolean, optional
margin_titles : bool, optional
{x, y}lim: tuples, optional
subplot_kws : dict, optional
gridspec_kws : dict, optional
|
---|
方法(后面补)
__init__ (data [,row,col,hue,col_wrap,...]) | 初始化matplotlib图和FacetGrid对象。 |
add_legend ([legend_data,title,label_order]) | 绘制一个图例,可能将其放在轴外并调整图形大小。 |
despine (** kwargs) | 从小平面上移除轴刺。 |
facet_axis (row_i,col_j) | 使这些索引识别的轴处于活动状态并返回。 |
facet_data () | 生成器用于每个方面的名称索引和数据子集。 |
map (func,* args,** kwargs) | 将绘图功能应用于每个方面的数据子集。 |
map_dataframe (func,* args,** kwargs) | 喜欢.map 但是将args作为字符串传递并在kwargs中插入数据。 |
savefig (* args,** kwargs) | 保存图。 |
set (** kwargs) | 在每个子图集Axes上设置属性。 |
set_axis_labels ([x_var,y_var]) | 在网格的左列和底行设置轴标签。 |
set_titles ([template,row_template,...]) | 在每个构面上方或网格边距上绘制标题。 |
set_xlabels ([label]) | 在网格的底行标记x轴。 |
set_xticklabels ([labels, step]) | 在网格的底行设置x轴刻度标签。 |
set_ylabels ([label]) | 在网格的左列标记y轴。 |
set_yticklabels ([labels]) | 在网格的左列上设置y轴刻度标签。 |
练习
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="darkgrid")
tips = sns.load_dataset("tips")
tips.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
tips['day'].unique()
# 从数据中可以看出sex、smoker、time均为两个状态值
[Sun, Sat, Thur, Fri]
Categories (4, object): [Sun, Sat, Thur, Fri]
g = sns.FacetGrid(tips, col="time")
# 像这样初始化网格会设置matplotlib图形和轴,但不会在它们上绘制任何内容。
# 在该网格上可视化数据的主要方法是使用该FacetGrid.map()方法。
# 为其提供绘图功能以及要绘制的数据框中的变量名称。让我们使用直方图来
# 查看每个子集中tip的分布。
g = sns.FacetGrid(tips, col="time")
g.map(plt.hist, "tip");
g = sns.FacetGrid(tips, col="sex", hue="smoker",col_wrap=2)
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();
# 此功能将绘制图形并注释轴,希望一步生成完成的绘图。要创建关系图,
# 只需传递多个变量名称。您还可以提供关键字参数,这些参数将传递给
# 绘图函数,看看col_wrap的功能
g = sns.FacetGrid(tips, col="sex", hue="smoker",col_wrap=1)
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();
# 此时col_wrap=1 ,说明col_wrap是限制网格中图的列的个数的
# 可以单独传递类构造函数改变网格外观
g = sns.FacetGrid(tips, row="smoker", col="time",
margin_titles=True)
g.map(sns.regplot, "size", "total_bill", color="red",
fit_reg=False, x_jitter=.2);
# margin_titles=True的作用是把标题写到侧面,
# fit_reg=False关闭回归,我们下面看看关闭效果
g = sns.FacetGrid(tips, row="smoker", col="time",
margin_titles=False)
g.map(sns.regplot, "size", "total_bill", color="red",
fit_reg=True, x_jitter=.2);
# 关闭margin_titles=False,打开fit_reg=True
# margin_titles打开的好处是可以让人很轻松的看明白图的差别
# margin_titlesmatplotlib API未正式支持,并且在所有情况下都可能
# 无法正常工作。特别是,它目前不能与位于绘图之外的图例一起使用。
# 通过 height、aspect提供每个面的高度以及纵横比来设置图形的大小
g = sns.FacetGrid(tips, col="day", height=4, aspect=.5)
g.map(sns.barplot, "sex", "total_bill");
# facet的默认排序源自DataFrame中的信息。如果用于定义构面的变量具有
# 分类类型,则使用类别的顺序。否则,facet将按照类别级别的出现顺序排列。
# 但是,可以使用适当的*_order参数指定任何构面尺寸的顺序
ordered_days = tips.day.value_counts().index
g = sns.FacetGrid(tips, row="day", row_order=ordered_days,
height=1.7, aspect=4,)
g.map(sns.distplot, "total_bill", hist=False, rug=True);
绘制成对数据关系
PairGrid还允许您使用相同的绘图类型快速绘制小子图的网格,以可视化每个
子图中的数据。在一个PairGrid中,每个行和列都分配给不同的变量,因此结果
图显示数据集中的每个成对关系。这种情节有时被称为“散点图矩阵”,因为这是
显示每种关系的最常用方式,但PairGrid不限于散点图。
理解a FacetGrid和a 之间的差异很重要PairGrid。在前者中,
每个方面都表现出以不同级别的其他变量为条件的相同关系。在后者中,
每个图显示不同的关系(尽管上三角和下三角将具有镜像图)。使用
PairGrid可以为您提供数据集中有趣关系的非常快速,非常高级的摘要。
该类的基本用法非常相似FacetGrid。首先初始化网格,然后将绘图函数
传递给map方法,并在每个子图上调用它。还有一个伴侣功能,pairplot()
它可以为更快的绘图提供一些灵活性。
iris = sns.load_dataset("iris")
# 该数据大家应该很熟悉了,就不看数据了
g = sns.PairGrid(iris)
g.map(plt.scatter);
# 可以在对角线上绘制不同的函数,以显示每列中变量的单变量分布。
# 但请注意,轴刻度不会与该图的计数轴或密度轴对应。
g = sns.PairGrid(iris)
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter);
# 使用此图的一种非常常见的方法是通过单独的分类变量对观察结果进行着色。
# 例如,iris数据集对三种不同种类的鸢尾花中的每一种都有四种测量值,
# 因此您可以看到它们之间的差异。
g = sns.PairGrid(iris, hue="species")
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter)
g.add_legend();
# 也可以在上三角和下三角中使用不同的函数来强调关系的不同方面。
g = sns.PairGrid(iris)
g.map_upper(plt.scatter)
g.map_lower(sns.kdeplot,color='red')
g.map_diag(sns.kdeplot, lw=2, legend=False);
# PairGrid很灵活,但要快速查看数据集,使用pairplot()可以更容易。
# 此功能默认使用散点图和直方图,但会添加一些其他类型
# (目前,您还可以绘制对角线上的回归图和对角线上的KDE)。
sns.pairplot(iris, hue="species", height=2.5);
# 还可以使用关键字参数控制绘图的美学,并返回PairGrid实例以进行
# 进一步调整。
g = sns.pairplot(iris, hue="species", palette="Set2", diag_kind="kde", height=2.5)