FacetGrid结构图
之前我们在绘图的时候,学了relplot
、catplot
、lmplot
等,这些函数可以通过col
、row
等在一个Figure
中绘制多个图。这些函数之所以有这些功能,是因为他们的底层使用了FacetGrid
来组装这些图形。今天我们就来学习FacetGrid
的使用。
一、普通的Axes绘图:
在学习FacetGrid
绘图之前,先来了解一下,实际上seaborn
的绘图函数中也有大量的直接使用Axes
进行绘图的,凡是函数名中已经明确显示了这个图的类型,这种图都是使用Axes
绘图的。比如sns.scatterplot
、sns.lineplot
、sns.barplot
等。Axes
绘图可以直接使用之前matplotlib
的一些方式设置图的元素。示例代码如下:
fig,[ax1,ax2] = plt.subplots(2,1,figsize=(10,10))
sns.scatterplot(x="total_bill",y="tip",data=tips,ax=ax1)
sns.barplot(x="day",y="total_bill",data=tips,ax=ax2)
二、FacetGrid基本使用:
先创建一个FacetGrid
对象,然后再调用这个对象的map
方法。其中map
方法的第一个参数是一个函数,后续map
将调用这个函数来绘制图形。后面的参数就是传给这个函数的参数。示例代码如下:
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips)
g.map(plt.scatter,"total_bill","tip")
效果图如下:
其中第一个参数是可以绘制Axes
图,并且可以接收color
参数的函数。可以取的值如下:
参数 | 描述 | 对应使用了FacetGrid 函数 |
---|---|---|
plt.plot /sns.lineplot |
绘制折线图 | sns.relplot(kind="line") |
plt.hexbin |
绘制六边形图形 | sns.jointplot(kind="hex") |
plt.hist |
绘制直方图 | sns.distplot |
plt.scatter /sns.scatterplot |
绘制散点图 | sns.relplot(kind="scatter") |
sns.stripplot |
绘制分类散点图 | sns.catplot(kind="strip") |
sns.swarmplot |
绘制散开来的分类散点图 | sns.catplot(kind="swarm") |
sns.boxplot |
绘制箱线图 | sns.catplot(kind="box") |
sns.violinplot |
绘制小提琴图 | sns.catplot(kind="violin") |
sns.pointplot |
绘制点线图 | sns.catplot(kind="point") |
sns.barplot |
绘制条形图 | sns.catplot(kind="bar") |
sns.countplot |
绘制数量柱状图 | sns.catplot(kind="count") |
sns.regplot |
绘制带有回归线的散点图 | sns.lmplot |
三、绘制多个图形:
FacetGrid
可以通过col
和row
参数,来在一个Figure
上绘制多个图形,其中col
和row
都是数据集中的某个列的名字。只要指定这个名字,那么就会自动的按照指定列的值的个数绘制指定个数的图形。示例代码如下:
g = sns.FacetGrid(tips,col="day",col_wrap=2)
g.map(sns.regplot,"total_bill","tip")
效果图如下:
四、添加颜色观察字段:
可以通过添加hue
参数来控制每个图中元素的颜色来观察其他的字段。示例代码如下:
g = sns.FacetGrid(tips,col="day",hue="time")
g.map(sns.regplot,"total_bill","tip")
也可以通过hue_kws
参数来添加hue
散点的属性,比如设置散点的样式等。
五、设置每个图形的尺寸:
使用FacetGrid
绘制出图形后,有时候我们想设置每个图形的尺寸或者是宽高比,那么我们可以通过在FacetGrid
中设置height
和aspect
来实现,其中height
表示的是每个图形的尺寸(默认是宽高一致),aspect
表示的是宽度/高度
的比例。示例代码如下:
g = sns.FacetGrid(tips,col="day",row="time",height=10,aspect=2)
g.map(sns.regplot,"total_bill","tip")
效果图如下:
六、设置图例:
默认情况下,不会添加图例,我们可以通过g.add_legend()
来添加图例。示例代码如下:
g = sns.FacetGrid(tips,col="day",hue="time")
g.map(sns.regplot,"total_bill","tip")
g.add_legend()
另外还可以:
- 通过
title
来控制图例的标题。 - 通过
label_order
来控制图例元素的顺序。
示例代码如下:
sns.set(rc={"font.sans-serif":"simhei"})
g3 = sns.FacetGrid(tips,col="day",hue="time")
g3.map(plt.scatter,"total_bill","tip")
new_labels = ['午餐','晚餐']
g3.add_legend(title="时间")
for t,l in zip(g3._legend.texts,new_labels):
t.set_text(l)
七、设置标题:
设置标题可以通过g.set_titles(template=None,row_template=None,col_template=None)
来实现,这三个参数分别代表的意义如下:
template
:给图设置标题,其中有{row_var}:绘制每行图像的名称
,{row_name}:绘制每行图像的值
,{col_var}:绘制每列图像的名称
,{col_name}:绘制每列图像的值
这几个参数可以使用。col_template
:给图像设置列的标题。其中有{col_var}
以及{col_name}
可以使用。row_template
:给图像设置行的标题。其中有{row_var}
以及{row_name}
可以使用。
示例代码如下:
g = sns.FacetGrid(tips,col="day",row="time")
g.map(sns.regplot,"total_bill","tip")
g.set_titles(template="时间{row_name}/星期{col_name}")
八、设置坐标轴:
g.set_axis_labels(x_var,y_var)
:一次性设置x
和y
的坐标的标题。g.set_xlabels(label)
:设置x
轴的标题。g.set_ylabels(label)
:设置y
轴的标题。g.set(xticks,yticks)
:设置x
和y
轴的刻度。g.set_xticklabels(labels)
:设置x
轴的刻度文字。g.set_yticklabels(labels)
:设置y
轴的刻度文字。
示例代码如下:
g.set(xticks=range(0,60,10),xticklabels=['$0','$10','$20','$30','$40','$50'])
效果图如下:
九、g.set
方法:
g.set
方法可以对FacetGrid
下的每个子图Axes
设置属性。其中可以设置的参数完全是根据Axes
的属性来的。比如可以设置每个Axes
的facecolor
等。关于Axes
有哪些属性,请参考matplotlib.Axes
的官方文档:https://matplotlib.org/api/axes_api.html?highlight=axes#matplotlib.axes.Axes
。
十、g.fig
:
通过g.fig
,可以获取到当前的Figure
对象。然后通过Figure
对象再可以设置其他的属性,比如dip
等。