3.Seaborn notes

Seaborn 绘制图形技巧主要在于数据思维难,如:怎么选择字段,怎么选择预处理数据,绘制什么图像,以及要在图像上体现数据统计量及其变化。我们应该去逐一理解数据,选择合适的技巧。下面举例了8个常用的绘制函数。每个函数调用时,针对DataFrame这种数据类型,要注意打算绘制哪些字段(哪些列),用什么绘制函数,输入参数有哪些,主要注意x,y选择的字段。

1.lineplot

绘制折线图命令:seaborn.lineplot(x, y, data, hue, legend),基本上了解这些参数就可以了。

  1. x,y就是数据的不同列会作为x轴,y轴的输入数据。如果具体指明对应的列,data参数可以不要。

    如示例中可以改为 sns.lineplot(x=fmri['timepoint'], y=fmri['signal'], hue=fmri['event'])

  2. data可以是df, ndarray等。一般是df,这时上面的x,y参数可以只写列名。

  3. hue利用颜色来表示类型变量, 如例子fmri中绘制不同event对应的折线

  4. legend 图例,默认“auto”。可以选full, 也可以具体制定。如例子fmri右上角event的图例。

具体查看官方解释

拿fmri示例:

1
2
3
4
5
6
7
8
9
fmri = sns.load_dataset("fmri")
fmri.head()
=======================================
subject timepoint event region signal
0 s13 18 stim parietal -0.017552
1 s5 14 stim parietal -0.080883
2 s12 18 stim parietal -0.081033
3 s11 18 stim parietal -0.046134
4 s10 18 stim parietal -0.037970
1
2
3
plt.figure(figsize=(8, 6), dpi=300)
sns.lineplot(data=fmri, x='timepoint', y='signal', hue='event')
plt.show()

image-20211122162234712

我们来进一步设置,让图更好看一点。

1
2
auto = pd.read_csv("Automobile_data.csv")
auto.head().T

auto信息如下:

image-20211122162403286

1
2
3
4
5
6
7
8
9
10
11
plt.figure(figsize=(12, 8), dpi=500)
sns.set(rc={
"axes.facecolor": "#283747", #背景色
"axes.grid": False, #不要网格
'xtick.labelsize':10,
'ytick.labelsize':10,
})
plt.title("Engine size", fontsize=14)
plt.xticks(rotation=45)
sns.lineplot(x=auto['engine-size'], y=auto['wheel-base'].index.values, color='#ffd700')
plt.show()

image-20211122162458464

2.Scatterplots

绘制散点图用 sns.scatterplot,其中:

  1. x, y, data用法类似折线图
  2. hue用颜色表示类型字段信息。
  3. size用点的大小表示类型字段信息。

还是 auto = pd.read_csv("Automobile_data.csv")这个df,我们探索 'engine-size''wheel-base'轴距之间的关系。

1
2
3
4
5
6
7
8
9
plt.figure(figsize=(12, 8), dpi=500)
sns.set(rc={
"axes.facecolor": "#ECECFF", #背景色
"axes.grid": False, #不要网格
'xtick.labelsize':10,
'ytick.labelsize':10,
})
sns.scatterplot(x='engine-size', y='wheel-base', data=auto)
plt.show()

image-20211122172246677

如果我们还要增加 fuel-type字段和 city-mpg字段信息,并只绘制 (20, 200)city-mpg数据,可以用hue颜色表示fuel-type,size大小表示city-mpg。

1
2
3
4
5
6
7
8
9
10
plt.figure(figsize=(12, 12), dpi=500)
# plt.xlim([50, 200]) #x轴限制在50, 200
# sns.set(rc={
# "axes.facecolor": "#ECECFF", #背景色
# "axes.grid": False, #不要网格
# 'xtick.labelsize':10,
# 'ytick.labelsize':10,
# })
sns.scatterplot(x='engine-size', y='wheel-base', data=auto, hue='fuel-type', size='city-mpg', sizes=(20, 200))
plt.show()

image-20211122173458993

3. relplot

relplot和scatterplot最主要区别是其有个kind参数可以选择scatter还是line。基本可以看做lineplot,scatterplot合体。

relplot 官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
plt.rcParams['savefig.dpi'] = 300 #图片分辨率
plt.rcParams['figure.dpi'] = 300 #显示分辨率

sns.relplot(x='wheel-base',
y='engine-size',
hue='fuel-type',
data=auto,
kind='scatter',
palette=['#FF3333', "#00CC00"], #指定颜色 两种'fuel-type'
height=8.5, #图像高
aspect=1,#图像纵横比
)
plt.show()

image-20211122175310664

4.barplot

barplot主要绘制数字变量和类别变量关系。示例中的city-mpgbody-style中的关系。可以将x,y变量调换让其横过来。其中:

  1. order是排序索引
  2. capsize指bar的帽子宽度,如示例中两黑色横线。 errwidth指bar的线宽。
1
2
3
4
5
6
7
8
order = auto.groupby(['body-style']).mean().sort_values(by='city-mpg', ascending=False).index
sns.barplot(auto['body-style'],
auto['city-mpg'],
order=order,
errwidth=1.0, #error bar线宽
capsize=0.1, #error bar 帽子宽度
)
plt.show()

image-20211122184507858

将其x,y调换将图像横过来,并随便指定个顺序。

1
2
3
4
5
6
7
8
order = ['hatchback', 'convertible', 'sedan', 'wagon', 'hardtop', ]
sns.barplot(auto['city-mpg'],
auto['body-style'],
order=order,
errwidth=1.0, #error bar线宽
capsize=0.1, #error bar 帽子宽度
)
plt.show()

image-20211122185222708

5.countplot

countplt用来绘制某个字段的数量分布信息.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
plt.figure(figsize=(10, 8))
sns.set(rc={
"axes.facecolor":"#6C6C6C", #背景色
"axes.grid":False,
'xtick.labelsize':14,
'ytick.labelsize':14
})
sns.countplot(x='body-style',
data=auto,
order=auto['body-style'].value_counts().index,
edgecolor='#ffd700',
# facecolor=(0,0,0,0),
# edgecolor=sns.color_palette("dark",3)
linewidth=1,)
plt.show()

image-20211122205909878

6. catplot

catplot本身是绘制类别分布情况,但是其可以绘制柱状图和violin,这个参数是kind。并且violin可以表示双变量。关于小提琴图和box图

1
2
3
4
5
6
7
8
sns.set(rc={
"axes.facecolor":"#ECFFFF", #背景色
"axes.grid":False,
'xtick.labelsize':8,
'ytick.labelsize':8
})
sns.catplot(x='city-mpg', y='body-style', data=auto, kind='violin', height=5, aspect=1)
plt.show()

image-20211122211452472

7.Dist plot

这部分主要是绘制histogram及核密度分布kernel density estimate(KDE)。

1
2
3
4
5
6
7
8
9
sns.set(rc={
"axes.facecolor":"#ECFFFF", #背景色
"axes.grid":False,
'xtick.labelsize':8,
'ytick.labelsize':8
})
#rug就是观测值 图上小柱子
sns.distplot(auto['engine-size'], kde=True, rug=True, hist=True, vertical=False)
plt.show()

image-20211122213105405

我们可以用kdeplot只绘制kde图, cmap 查询页.

1
2
sns.kdeplot(auto['city-mpg'], auto['engine-size'], shade=True, cmap='rainbow', shade_lowest=False)
plt.show()

image-20211122214202818

8. heatmap

一般用到热力图用来看相关性。参数主要有:

  • vmax:设置颜色带的最大值
  • vmin:设置颜色带的最小值
  • center:设置颜色带的分界线
  • annot=True:小格子里填不填注释
  • fmt:小格子里数据格式
  • linewidths:小格子间间隔线宽度
1
2
3
4
5
corr = auto.corr()
sns.heatmap(corr, cmap='Reds', center=0.5, vmin=0.0, vmax=1.0, annot=True, fmt=".1f", linewidths=0.1)
plt.xticks(rotation=45)
plt.yticks(rotation=45)
plt.show()

image-20211122220753662

Inference

[1] Seaborn Tutorial