Seaborn学习(一)------- 构建结构化多绘图网格(FacetGrid()、map())详解


      在探索中等维数据时,一种有用的方法是在数据集的不同子集上绘制同一图的多个实例。这种技术有时被称为“格子”或“格子”绘图,它与“小倍数”的概念有关。它允许查看者快速提取有关复杂数据的大量信息。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(datarow=Nonecol=Nonehue=Nonecol_wrap=Nonesharex=Truesharey=Trueheight=3aspect=1palette=Nonerow_order=Nonecol_order=Nonehue_order=Nonehue_kws=Nonedropna=Truelegend_out=Truedespine=Truemargin_titles=Falsexlim=Noneylim=Nonesubplot_kws=Nonegridspec_kws=Nonesize=None)

Parameters:

data : DataFrame

处理后的(“长格式”)dataframe数据,其中每一列都是一个变量(特征),每一行都是一个样本

row, col, hue : strings 

定义数据子集的变量,这些变量将在网格的不同方面绘制。请参阅下面*_order参数以控制该变量的级别顺序

例如:col="sex", hue="smoker",即列表示性别,颜色语意表示是否吸烟,下面示例会给出详细说明

col_wrap : int, optional

这个意思是图网格列维度限制,比如col_wrap =3,那么在这个画布里最多只能画3列。行不限制,这样就限制了列的个数。

share{x,y} : bool, ‘col’, or ‘row’ optional

是否共享x轴或者y轴,就是说如果为真,就共享同一个轴,否则就不共享,默认是都共享,即都为True

g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True)# 都共享
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();

g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=False)# 关闭共享y轴
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();

大家看看右边的y轴是否变化了,一旦不共享,他就会自己标注

height : scalar, optional

每个图片的高度设定,默认为3

aspect : scalar, optional

文档说是纵横比,是说每个小图的横轴长度和纵轴的比

g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True, aspect=1) # 默认为1,即等高等宽
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();

g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True, aspect=0.5) # 改为0.5
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();

palette : palette name, list, or dict, optional

这个简单,一般在使用hue时来改变颜色的,有这几种系统给的可选deep, muted, bright, pastel, dark, colorblind

举个例子还是上图的啊,不给代码了,直接上图了,此时我给的是palette='colorblind'

{row,col,hue}_order : lists, optional

对所给命令的级别进行排序。默认情况下,这将是数据中显示的级别,如果变量是pandas分类,则是类别顺序。

举个例子:

g = sns.FacetGrid(tips, col="sex", hue="smoker",sharex=True, sharey=True,col_order=['老大', '老二', '老三', '老四'])
g.map(plt.scatter, "total_bill", "tip", alpha=0.8)
g.add_legend();

调换一下位置看看:

就不全上传代码了,关键代码给出: col_order=['老大', '老二', '老三', '老四']

 

到这里大家就可以看出来了,这个命令是可以让我们设置画图的顺序的 

hue_kws : dictionary of param -> list of values mapping

其他关键字参数插入到绘图调用中,让其他绘图属性在色相变量的级别上有所不同(例如散点图中的标记)

>>> pal = dict(Lunch="seagreen", Dinner="gray") # 先定义一个字典,把颜色确定
>>> g = sns.FacetGrid(tips, col="sex", hue="time", palette=pal,# 然后传递给palette
...                   hue_order=["Dinner", "Lunch"])#hue_order这个官方解释的好,优先Dinner
>>> g = (g.map(plt.scatter, "total_bill", "tip", **kws)
...      .add_legend()) 

../_images/seaborn-FacetGrid-9.png

>>> g = sns.FacetGrid(tips, col="sex", hue="time", palette=pal,hue_order=["Dinner", "Lunch"], 
hue_kws=dict(marker=["^", "v"])) # 给颜色语意使用不同的标签,这样可以进行一部分区别
>>> g = (g.map(plt.scatter, "total_bill", "tip", **kws).add_legend()) 

../_images/seaborn-FacetGrid-10.png

总结来说,hue_kwss就是增加能快速辨识的方法,在变量很多时很有用,我把hue_order=["Dinner", "Lunch"]换一下位置看看,确实是有顺序的

legend_out : bool, optional

默认为True,legend是图例的意思,如果True,图形尺寸将被扩展,并且图例将被绘制在中心右侧的图形之外,上面的图都是这样的,为假时,图例单独放出来,下面是为假的情况,看下下面的图例和上面的区别

despine : boolean, optional

从图中移除顶部和右侧脊柱,就是边缘框架

margin_titles : bool, optional

如果是真的,那么行变量的标题就会被绘制到最后一列的右边。这个选项是实验性的,在所有情况下都可能不起作用。

直接看图吧:

g = sns.FacetGrid(tips, row="smoker", col="time", 
                  margin_titles=False) # margin_titles为假的时候
g.map(sns.regplot, "size", "total_bill", color="red",
      fit_reg=False, x_jitter=.2);

再给出margin_titles=True的图,代码和上面一样,可以看出来了,行变量的标题就会被绘制到最后一列的右边

{x, y}lim: tuples, optional

每个方面的每个轴的限制(只有当共享x时才相关,y是正确的

subplot_kws : dict, optional

传递给matplotlib的subplot(s) 方法的关键字参数字典Dictionary of keyword arguments passed to matplotlib subplot(s) methods.这个需要看看subplot函数的参数,后面有时间补上

gridspec_kws : dict, optional

传递给matplotlib的gridspec模块的关键字参数的字典(Via plt.subplots)。matplotlib >= 1.4,如果colwrap不是None,则会被忽略。也许查看相关函数,改天再补上

这个两个参数是为了和matplotlib传参是使用的

方法(后面补)

__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)

猜你喜欢

转载自blog.csdn.net/weixin_42398658/article/details/82960379