Seaborn介绍

接下来会用到的数据:

链接:https://pan.baidu.com/s/1RAqFCxWcl4OEChlRtSBooA
提取码:612s

Seaborn 是一个基于 matplotlib 且数据结构与 pandas 统一的统计图制作库。他提前已经定义好了一套自己的风格。然后也封装了一系列的方便的绘图函数,之前通过matplotlib需要很多代码才能完成的绘图,使用seaborn可能就是一行代码的事情。

  • 关系型绘图
  • 分类型绘图
  • 分布型绘图
  • 线性关系绘图

Seaborn安装

1.通过 pippip install seaborn

2.通过anacondaconda install seaborn

关系型绘图

seaborn.relplot()

这个函数功能非常强大,可以用来表示多个变量之间的关联关系。默认情况下是绘制散点图,也可以绘制线性图,具体绘制什么图形是通过kind参数来决定的。实际上以下两个函数就是relplot的特例:

  • 散点类型:scatterplot -> relplot(kind=”scatter”)
  • 线性类型:lineplot -> relplot(kind=”line”)

基本使用

1
2
3
4
5
6
7
8
9
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')
# print(tips.head())
# axes = sns.scatterplot(x='total_bill',y='tip',data=tips)
sns.relplot(x='total_bill',y='tip',data=tips)
plt.show()

hue参数

hue参数是用来控制第三个变量的颜色显示的。比如我们在以上图的基础之上体现出星期几的参数,那么可以通过以下代码来实现:

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')
print(tips.head())

# axes = sns.scatterplot(x='total_bill',y='tip',data=tips)

sns.relplot(x='total_bill',y='tip',data=tips,hue='day') #定义hue为day 根据day进行分类
plt.show()

添加col和row参数

colrow,可以将图根据某个属性的值的个数分割成多列或者多行。比如在以上图的基础之上我们想要把Lunch(午餐)Dinner(晚餐)分割成两个图来显示,那么可以通过以下代码来实现:

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
print(tips.head())
sns.relplot(x='total_bill',y='tip',data=tips,hue='day',col='time')
plt.show()

col及row

绘制折线图

relplot通过设置kind="line"可以绘制折线图。并且他的功能比plt.plot更加强大。plot只能指定具体的xy轴的数据(比如x轴是N个数,y轴也必须为N个数)。而relplot则可以在自动在两组数据中进行计算绘图。示例代码如下:

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
fmri = pd.read_csv('./fmri.csv')
# print(fmri.head())
sns.relplot(x='timepoint',y='signal',kind='line',data=fmri)
plt.show()

分类绘图

分类图的绘制,采用的是sns.catplot来实现的。catcategory的简写。这个方法默认绘制的是分类散点图,如果想要绘制其他类型的图,同样也是通过kind参数来指定。

主要分为

  • 分类散点图
  • 分类分布图
  • 分类统计图

分类散点图

分类散点图比较适合数据量不是很多的情况,他是用catplot来实现,但是也有以下两个特别的方法。

  • stripplot():catplot(kind=”strip”) 默认的
  • swarmplot():catplot(kind=”swarm”)
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')

sns.catplot(x='day',y='total_bill',data=tips,hue='sex')#kind默认为strip
plt.show()

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')
# sns.catplot(x='day',y='total_bill',data=tips,hue='sex')

sns.catplot(x='day',y='total_bill',data=tips,hue='sex',kind='swarm')

plt.show()

分类分布图

分类分布图,主要是根据分类来看,然后在每个分类下数据的分布情况。也是通过catplot来实现,以下三个方法分别是不同的kind参数:

  • 箱型图:boxplot() (with kind=”box”)
  • 小提琴图:violinplot() (with kind=”violin”)

箱型图

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')
print(tips.head())

sns.boxplot(x='day',y='total_bill',data=tips)
plt.show()

boxplot

小提琴图

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

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')
print(tips.head())

sns.violinplot(x='day',y='total_bill',data=tips,hue='sex',split=True,inner='quartile')
#hue 用sex进行分类 split可以对分类进行整合放入一张图,inner显示四分位
plt.show()

小提琴图

分类统计图

分类统计图,则是根据分类,统计每个分类下的数据的个数或者比例。有以下几种方式:

  • 条形图:barplot() (with kind=”bar”)
  • 柱状图:countplot() (with kind=”count”)
  • 点线图:pointplot() (with kind=”point”)

条形图

seaborn中的条形图具有统计功能,可以统计出比例,平均数,也可以按照你想要的统计函数来统计。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')
print(tips.head())

# sns.violinplot(x='day',y='total_bill',data=tips,hue='sex',split=True,inner='quartile')
sns.catplot(x='day',y='total_bill',data=tips,kind='bar')
# sns.barplot(x='day',y='total_bill',data=tips)
plt.show()

条形图

柱状图

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

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

titanic = pd.read_csv('./titanic.csv')
sns.catplot(x='sex',data=titanic,kind='count')
plt.show()

柱状图

点线图

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

1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

titanic = pd.read_csv('./titanic.csv')
print(titanic.head())
sns.catplot(x='sex',y='survived',data=titanic,kind='point',hue='class')
plt.show()

点线图


分布绘图

分布绘图主要分为单变量分布以及二变量分布pairplot

单变量分布

单一变量主要就是通过直方图来绘制。在seaborn中直方图的绘制采用的是distplot,其中distdistribution的简写,不是histogram的简写。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

titanic = pd.read_csv('./titanic.csv')
print(titanic.head())

sns.displot(titanic['age'],kde=True,bins=30,rug=True) #kde=True 显示kde曲线,bins调整组数,rug显示分布密集程度
# sns.kdeplot(titanic['age']) #kde绘图
plt.show()

二变量分布

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

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')

sns.jointplot(x='total_bill',y='tip',data=tips)
plt.show()

  • 通过设置kind='reg'可以设置回归绘图和核密度曲线
1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')


sns.jointplot(x='total_bill',y='tip',data=tips,kind='reg')
plt.show()

hoinplot-reg

  • 通过设置kind='hex'可以绘制六边形图
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
sns.jointplot(x='total_bill',y='tip',data=tips,kind='hex')
plt.show()

joinplot-hex

jointplot其它常用参数

  1. x,y,data:绘制图的数据。
  2. kindscatterregresidkdehex
  3. color:绘制元素的颜色。
  4. height:图的大小,图会是一个正方形。
  5. ratio:主图和副图的比例,只能为一个整形。
  6. space:主图和副图的间距。
  7. dropna:是否需要删除x或者y值中出现了NAN的值。
  8. marginal_kws:副图的一些属性,比如设置binsrug等。

pairplot:观察变量两两之间的关系

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
sns.pairplot(tips,vars=['total_bill','tip'])
plt.show()

变量关系图

默认情况下,对角线的图(x和y轴的列相同)是直方图,其他地方的图是散点图,如果想要修改这两种图,可以通过diag_kindkind来实现。其中这两个参数可取的值为:

  1. diag_kindauto, hist, kde
  2. kindscatter, reg
1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
sns.pairplot(tips,vars=['total_bill','tip'],diag_kind='kde',kind='reg')
plt.show()

1111

线性回归绘图

线性回归图可以帮助我们看到数据的关系趋势。在seaborn中可以通过regplotlmplot两个函数来实现。regplotxy可以为Numpy数组Series等变量。而lmplotxy则必须为字符串,并且data的值不能为空:

  1. regplot(x,y,data=None)
  2. lmplot(x,y,data)
1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
sns.regplot(x='total_bill',y='tip',data=tips)
#sns.lmplot(x='total_bill',y='tip',data=tips)
plt.show()

线性回归图

FacetGrid结构图

relplotcatplotlmplot可以通过colrow等在一个Figure中绘制多个图。这些函数之所以有这些功能,是因为他们的底层使用了FacetGrid来组装这些图形。

Axes绘图

实际上seaborn的绘图函数中也有大量的直接使用Axes进行绘图的,凡是函数名中已经明确显示了这个图的类型,这种图都是使用Axes绘图的。比如sns.scatterplotsns.lineplotsns.barplot等。Axes绘图可以直接使用之前matplotlib的一些方式设置图的元素。

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
fig,ax = plt.subplots(1,2,figsize=(20,5)) #创建一行两列画布
sns.scatterplot(x="total_bill",y="tip",data=tips,ax=ax[0])#第一个绘图散点图
sns.barplot(x="day",y="total_bill",data=tips,ax=ax[1])#第二个绘图柱状图
plt.show()

注意axes绘图

  • 凡是函数名中已经明确了图的类型,都是直接使用 Axes 进行绘图。构建子图需结合matplotlib
  • 直接使用Axes绘图,参数更加灵活(可以使用标签索引或字符串)
  • relplot/catplot/lmplot等函数都是用的FacetGrid方法技术
  • FaceGrid 可以通过 colrow 等参数来一次性构建多个图形
  • FacetGrid绘图的 xy 参数,必须为 DataFrame 的列的名字(字符串)

FacetGrid使用

  • 先创建一个FacetGrid对象
  • 再调用这个对象的map方法
  • map的第一个参数是函数
  • 后续map通过调用该函数绘制图形
  • 后面的参数是传给函数的参数
1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
fg = sns.FacetGrid(tips) #创建FG对象
fg.map(plt.scatter,'total_bill','tip') #通过map函数绘图
plt.show()

FG绘图

其中第一个参数是可以绘制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中设置heightaspect来实现,其中height表示的是每个图形的尺寸(默认是宽高一致),aspect表示的是宽度/高度的比例。

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
fg = sns.FacetGrid(tips,col='smoker',height=4,aspect=0.8)
#设置图形比例 height 宽高比aspect order可以指定柱形图顺序
fg.map(sns.barplot,'day','total_bill',order=['Sat','Thur','Fri','Sun'])
plt.show()

设置图例

默认情况下,不会添加图例,我们可以通过g.add_legend()来添加图例。

1
2
3
g = sns.FacetGrid(tips,col="day",hue="time")
g.map(sns.regplot,"total_bill","tip")
g.add_legend()

注意:

  • 通过title来控制图例的标题。
  • 通过label_order来控制图例元素的顺序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
fg = sns.FacetGrid(tips,col='day',hue='time')
fg.map(plt.scatter,'total_bill','tip')
#添加图例
fg.add_legend(title='时间',label_order=['Dinner','Lunch'])
new_lable = ['晚餐','午餐']
print(fg._legend.texts) #图例信息
print(list(zip(fg._legend.texts, new_lable)))
for text,lable in list(zip(fg._legend.texts,new_lable)):
text.set_text(lable)
plt.show()
1
2
[Text(0, 0, 'Dinner'), Text(0, 0, 'Lunch')]
[(Text(0, 0, 'Dinner'), '晚餐'), (Text(0, 0, 'Lunch'), '午餐')]

图例设置

设置标题

设置标题可以通过g.set_titles(template=None,row_template=None,col_template=None)来实现,这三个参数分别代表的意义如下:

  1. template:给图设置标题,其中有{row_var}:绘制每行图像的名称{row_name}:绘制每行图像的值{col_var}:绘制每列图像的名称{col_name}:绘制每列图像的值这几个参数可以使用。
  2. col_template:给图像设置列的标题。其中有{col_var}以及{col_name}可以使用。
  3. row_template:给图像设置行的标题。其中有{row_var}以及{row_name}可以使用。

设置坐标轴

g.set_axis_labels(x_var,y_var):一次性设置xy的坐标的标题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
tips = pd.read_csv('./tips.csv')

#设置标题
fg = sns.FacetGrid(tips,col='day',row='time')
fg.map(sns.regplot,'total_bill','tip')
#实现每张子图设置标题
fg.set_titles(template='时间:{row_name}/星期:{col_name}')
#设置坐标轴
fg.set_axis_labels('消防金额','小费')
fg.set(facecolor='y',xticks=range(0,50,5),xticklabels=[f'{i}元'for i in range(0,50,5)])
plt.show()

背景标题坐标轴设置

Seaborn样式风格设置

seaborn绘图,比直接使用matplotlib绘图更加的美观。原因就是因为seaborn中已经将一些属性的样式进行了调整。我们可以直接使用,也可以修改他的样式。

风格设置函数

seaborn中,可以通过三个函数来设置样式。分别是sns.set_stylesns.axes_style以及sns.set方法。

sns.axes_style

  • 如果没有传任何参数 返回的是字段属性
  • 临时的样式
1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

tips = pd.read_csv('./tips.csv')
sns.set_style('whitegrid') #darkgrid灰色网格
sns.scatterplot(x="total_bill",y="tip",data=tips)
print(sns.axes_style())
plt.show()

style

sns.set_style()

这个函数跟sns.axes_style一样,也是用来设置绘图风格。但是这个函数的风格设置,不是临时的,而是一旦设置了,那么下面的所有绘图都是用这个风格。

1
2
sns.set_style("darkgrid")
sns.scatterplot(x="total_bill",y="tip",data=tips)

sns.set

set方法也是用来设置样式的,他的功能更加强大。除了style以外,还可以设置调色板,字体,字体大小,颜色等,也可以设置其他的matplotlib.rcParams可以接收的参数。

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']

fmri = pd.read_csv('./fmri.csv')
sns.set(rc={'lines.linewidth':10}) #设置线宽
sns.lineplot(x="timepoint",y="signal",data=fmri)
# print(sns.axes_style())
plt.show()

线宽变化

调色盘设置

seaborn可以非常迅速的做出优美的图形,其中就应该得力于他的调色盘机制。seaborn根据应用场景提供了三种不同类型的调色盘:定性的连续的发散的

定性调色盘

定性调色盘。一般在数据不连续,比较离散,想体现分类的情况下使用。

默认调色盘

seaborn中,默认情况下就设置了一些颜色供绘图使用。使用sns.color_palette即可获取。并且我们可以通过sns.palplot来绘制调色盘。

1
2
current_palette = sns.color_palette()
sns.palplot(current_palette)

默认调色盘

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

配置亮度饱和度

1
2
current_palette = sns.color_palette("dark")
sns.palplot(current_palette)

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

设置hls

另外也可以通过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
2
3
4
5
# 获取名字为blue green的颜色
print(sns.xkcd_rgb["blue green"])
# 用xkcd的颜色名称构建一个palette对象
colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))

连续的颜色盘

有时候我们绘图的时候,想要使用一个同种色系,但是不同深浅,这时候就可以使用连续的颜色盘。

1
sns.palplot(sns.color_palette("Blues"))

连续调色盘

默认颜色是从浅入深,如果想要从深变浅,那么可以在色系后加一个_r

1
sns.palplot(sns.color_palette("Blues_r"))

反向

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

选择色系

离散的色盘

离散的色盘,是两边的颜色逐渐加深,中间的颜色最淡。或者是中间的颜色最深,两边的颜色最淡。一般离散的色盘可以用于比如温度,零度以上可以用红色表示,零度以下用蓝色表示。越红的地方,表示温度越高,越蓝的地方,表示温度越低。

1
2
3
values = [12,15,17,18,-5,-10]
with sns.color_palette("RdBu_r"):
sns.barplot([1,2,3,4,5,6],sorted(values))

离散调色盘

也可以通过sns.choose_colorbrewer_palette("diverging")查看离散的色盘有哪些可以选择。

官方文档

https://seaborn.pydata.org/tutorial/color_palettes.html