Seaborn介绍
接下来会用到的数据:
链接:https://pan.baidu.com/s/1RAqFCxWcl4OEChlRtSBooA
提取码:612s 
Seaborn 是一个基于 matplotlib 且数据结构与 pandas 统一的统计图制作库。他提前已经定义好了一套自己的风格。然后也封装了一系列的方便的绘图函数,之前通过matplotlib需要很多代码才能完成的绘图,使用seaborn可能就是一行代码的事情。
- 关系型绘图
 - 分类型绘图
 - 分布型绘图
 - 线性关系绘图
 
Seaborn安装
1.通过 pip :pip install seaborn  
2.通过anaconda: conda install seaborn
关系型绘图
seaborn.relplot()
这个函数功能非常强大,可以用来表示多个变量之间的关联关系。默认情况下是绘制散点图,也可以绘制线性图,具体绘制什么图形是通过kind参数来决定的。实际上以下两个函数就是relplot的特例:
- 散点类型:scatterplot -> relplot(kind=”scatter”)
 - 线性类型:lineplot -> relplot(kind=”line”)
 
基本使用
1  | import pandas as pd  | 

hue参数
hue参数是用来控制第三个变量的颜色显示的。比如我们在以上图的基础之上体现出星期几的参数,那么可以通过以下代码来实现:
1  | import pandas as pd  | 
添加col和row参数
col和row,可以将图根据某个属性的值的个数分割成多列或者多行。比如在以上图的基础之上我们想要把Lunch(午餐)和Dinner(晚餐)分割成两个图来显示,那么可以通过以下代码来实现:
1  | import pandas as pd  | 

绘制折线图
relplot通过设置kind="line"可以绘制折线图。并且他的功能比plt.plot更加强大。plot只能指定具体的x和y轴的数据(比如x轴是N个数,y轴也必须为N个数)。而relplot则可以在自动在两组数据中进行计算绘图。示例代码如下:
1  | import pandas as pd  | 
分类绘图
分类图的绘制,采用的是sns.catplot来实现的。cat是category的简写。这个方法默认绘制的是分类散点图,如果想要绘制其他类型的图,同样也是通过kind参数来指定。
主要分为
- 分类散点图
 - 分类分布图
 - 分类统计图
 
分类散点图
分类散点图比较适合数据量不是很多的情况,他是用catplot来实现,但是也有以下两个特别的方法。
- stripplot():catplot(kind=”strip”) 默认的
 - swarmplot():catplot(kind=”swarm”)
 
1  | import pandas as pd  | 

1  | import pandas as pd  | 

分类分布图
分类分布图,主要是根据分类来看,然后在每个分类下数据的分布情况。也是通过catplot来实现,以下三个方法分别是不同的kind参数:
- 箱型图:boxplot() (with kind=”box”)
 - 小提琴图:violinplot() (with kind=”violin”)
 
箱型图
1  | import pandas as pd  | 

小提琴图
小提琴实际上就是两个对称的核密度曲线合并起来,然后中间是一个箱线图(也可以为其他图)组成的。通过小提琴图可以看出数据的分布情况。示例代码如下:
1  | import pandas as pd  | 

分类统计图
分类统计图,则是根据分类,统计每个分类下的数据的个数或者比例。有以下几种方式:
- 条形图:barplot() (with kind=”bar”)
 - 柱状图:countplot() (with kind=”count”)
 - 点线图:pointplot() (with kind=”point”)
 
条形图
seaborn中的条形图具有统计功能,可以统计出比例,平均数,也可以按照你想要的统计函数来统计。示例代码如下:
1  | import pandas as pd  | 

柱状图
柱状图是专门用来统计某个单一变量出现数量的图形。示例代码如下:
1  | import pandas as pd  | 

点线图
点线图可以非常方便的看到变量之间的趋势变化。示例代码如下:
1  | import pandas as pd  | 

分布绘图
分布绘图主要分为单变量分布以及二变量分布和pairplot
单变量分布
单一变量主要就是通过直方图来绘制。在seaborn中直方图的绘制采用的是distplot,其中dist是distribution的简写,不是histogram的简写。示例代码如下:
1  | import pandas as pd  | 

二变量分布
多变量分布图可以看出两个变量之间的分布关系。一般都是采用多个图进行表示。多变量分布图采用的函数是jointplot。
1  | import pandas as pd  | 

- 通过设置
kind='reg'可以设置回归绘图和核密度曲线 
1  | import pandas as pd  | 

- 通过设置
kind='hex'可以绘制六边形图 
1  | import pandas as pd  | 

jointplot其它常用参数
x,y,data:绘制图的数据。kind:scatter、reg、resid、kde、hex。color:绘制元素的颜色。height:图的大小,图会是一个正方形。ratio:主图和副图的比例,只能为一个整形。space:主图和副图的间距。dropna:是否需要删除x或者y值中出现了NAN的值。marginal_kws:副图的一些属性,比如设置bins、rug等。
pairplot:观察变量两两之间的关系
1  | import pandas as pd  | 

默认情况下,对角线的图(x和y轴的列相同)是直方图,其他地方的图是散点图,如果想要修改这两种图,可以通过diag_kind和kind来实现。其中这两个参数可取的值为:
diag_kind:auto,hist,kde。kind:scatter,reg。
1  | import pandas as pd  | 

线性回归绘图
线性回归图可以帮助我们看到数据的关系趋势。在seaborn中可以通过regplot和lmplot两个函数来实现。regplot的x和y可以为Numpy数组、Series等变量。而lmplot的x和y则必须为字符串,并且data的值不能为空:
regplot(x,y,data=None)。lmplot(x,y,data)。
1  | import pandas as pd  | 

FacetGrid结构图
relplot、catplot、lmplot可以通过col、row等在一个Figure中绘制多个图。这些函数之所以有这些功能,是因为他们的底层使用了FacetGrid来组装这些图形。
Axes绘图
实际上seaborn的绘图函数中也有大量的直接使用Axes进行绘图的,凡是函数名中已经明确显示了这个图的类型,这种图都是使用Axes绘图的。比如sns.scatterplot、sns.lineplot、sns.barplot等。Axes绘图可以直接使用之前matplotlib的一些方式设置图的元素。
1  | import pandas as pd  | 
注意
- 凡是函数名中已经明确了图的类型,都是直接使用 
Axes进行绘图。构建子图需结合matplotlib - 直接使用
Axes绘图,参数更加灵活(可以使用标签索引或字符串) relplot/catplot/lmplot等函数都是用的FacetGrid方法技术FaceGrid可以通过col和row等参数来一次性构建多个图形FacetGrid绘图的x和y参数,必须为DataFrame的列的名字(字符串)
FacetGrid使用
- 先创建一个
FacetGrid对象 - 再调用这个对象的
map方法 map的第一个参数是函数- 后续map通过调用该函数绘制图形
 - 后面的参数是传给函数的参数
 
1  | import pandas as pd  | 

其中第一个参数是可以绘制Axes图,并且可以接收color参数的函数。
| 参数 | 描述 | FacetGrid函数 | 
|---|---|---|
plt.plot/sns.lineplot | 
绘制折线图 | sns.relplot(kind="line") | 
plt.hexbin | 
绘制六边形图形 | sns.jointplot(kind="hex") | 
plt.scatter/sns.scatterplot | 
绘制散点图 | sns.relplot(kind="scatter") | 
plt.hist | 
绘制直方图 | sns.distplot | 
sns.stripplot | 
绘制分类散点图 | sns.catplot(kind="strip") | 
sns.swarmplot | 
散开来的分类散点图 | sns.catplot(kind="swarm") | 
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绘制出图形后,有时候我们想设置每个图形的尺寸或者是宽高比,那么我们可以通过在FacetGrid中设置height和aspect来实现,其中height表示的是每个图形的尺寸(默认是宽高一致),aspect表示的是宽度/高度的比例。
1  | import pandas as pd  | 

设置图例
默认情况下,不会添加图例,我们可以通过g.add_legend()来添加图例。
1  | g = sns.FacetGrid(tips,col="day",hue="time")  | 
注意:
- 通过
title来控制图例的标题。 - 通过
label_order来控制图例元素的顺序。 
1  | import pandas as pd  | 
1  | [Text(0, 0, 'Dinner'), Text(0, 0, 'Lunch')]  | 

设置标题
设置标题可以通过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.set_axis_labels(x_var,y_var):一次性设置x和y的坐标的标题。
1  | import pandas as pd  | 

Seaborn样式风格设置
用seaborn绘图,比直接使用matplotlib绘图更加的美观。原因就是因为seaborn中已经将一些属性的样式进行了调整。我们可以直接使用,也可以修改他的样式。
风格设置函数
在seaborn中,可以通过三个函数来设置样式。分别是sns.set_style、sns.axes_style以及sns.set方法。
sns.axes_style
- 如果没有传任何参数 返回的是字段属性
 - 临时的样式
 
1  | import pandas as pd  | 

sns.set_style()
这个函数跟sns.axes_style一样,也是用来设置绘图风格。但是这个函数的风格设置,不是临时的,而是一旦设置了,那么下面的所有绘图都是用这个风格。
1  | sns.set_style("darkgrid")  | 
sns.set
set方法也是用来设置样式的,他的功能更加强大。除了style以外,还可以设置调色板,字体,字体大小,颜色等,也可以设置其他的matplotlib.rcParams可以接收的参数。
1  | import pandas as pd  | 

调色盘设置
seaborn可以非常迅速的做出优美的图形,其中就应该得力于他的调色盘机制。seaborn根据应用场景提供了三种不同类型的调色盘:定性的、连续的、发散的。
定性调色盘
定性调色盘。一般在数据不连续,比较离散,想体现分类的情况下使用。
默认调色盘
在seaborn中,默认情况下就设置了一些颜色供绘图使用。使用sns.color_palette即可获取。并且我们可以通过sns.palplot来绘制调色盘。
1  | current_palette = sns.color_palette()  | 

默认的调色盘有10中颜色。这些颜色都有6中风格。分别是:deep,muted,pastel, bright,dark,colorblind。这几种风格的颜色不变,主要调整的是亮度和饱和度。

1  | current_palette = sns.color_palette("dark")  | 
hls圆形颜色系统
hls圆形颜色系统是颜色按照顺序,经过偏移,无缝形成一个圆形。我们在使用这个调色盘的时候,可以指定需要使用多少种颜色。
1  | sns.palplot(sns.color_palette("hls",20))  | 

也可以使用另外一个函数sns.hls_palette(n_colors=6, h=0.01, l=0.6, s=0.65)来实现。这个函数可以传递更多的参数。比如我们可以通过更改hue来更改开始的颜色,通过更改l来调整亮度,通过更改s来调整饱和度。
1  | sns.palplot(sns.hls_palette(10,h=0.4,l=0.4,s=0.5))  | 

另外也可以通过sns.husl_palette来实现色系的调整,这个方法比sns.hls_palette亮度和饱和度更加的均匀。
1  | sns.palplot(sns.husl_palette(10))  | 

分类颜色
分类颜色是seaborn已经提前给你定义了一些颜色,使用这些颜色在做分类分组的时候可以按照自己的需求选择。
1  | sns.palplot(sns.color_palette("Paired"))  | 

关于分类的颜色选择,可以通过sns.choose_colorbrewer_palette("qualitative")来查看。这个方法只能用在jupyter notebook中。可以选择不同的样式,然后还可以调节饱和度等。

用xkcd颜色
xkcd是一个漫画名称或者是工作室。xkcd开展了一项众包活动,为随机的RGB颜色命名。这产生了一组954种命名颜色。我们可以从sns.xkcd_palette里面提取颜色。提取到后,如果想要用在palette参数中,那么还需要放到sns.xkcd_palette中。所有的xkcd颜色的名称可以参考官网:https://xkcd.com/color/rgb/。
1  | # 获取名字为blue green的颜色  | 
连续的颜色盘
有时候我们绘图的时候,想要使用一个同种色系,但是不同深浅,这时候就可以使用连续的颜色盘。
1  | sns.palplot(sns.color_palette("Blues"))  | 

默认颜色是从浅入深,如果想要从深变浅,那么可以在色系后加一个_r。
1  | sns.palplot(sns.color_palette("Blues_r"))  | 

我们也可以通过sns.choose_colorbrewer_palette("sequential")查看有哪些色系可供选择。

离散的色盘
离散的色盘,是两边的颜色逐渐加深,中间的颜色最淡。或者是中间的颜色最深,两边的颜色最淡。一般离散的色盘可以用于比如温度,零度以上可以用红色表示,零度以下用蓝色表示。越红的地方,表示温度越高,越蓝的地方,表示温度越低。
1  | values = [12,15,17,18,-5,-10]  | 

也可以通过sns.choose_colorbrewer_palette("diverging")查看离散的色盘有哪些可以选择。
官方文档
https://seaborn.pydata.org/tutorial/color_palettes.html。
