MENU

Seaborn学习记录

• September 25, 2021 • Read: 2812 • Python

seaborn是一个关注于统计的python高级绘图库,其实虽然是关注于统计,但科学计算结果的可视化往往会涉及到两个量之间关系的表达,因此,曲线图或者散点图是必不可少,因此,seaborn的使用也绝非限制在统计学范畴,任何想要进行数据可视化的人都可以使用。对于seaborn来说,它是基于python的matplotlib库的高级封装,能够通过封装好的API进行绘图,且代码量大大减少,当然高度的封装和定制,会限制绘图的自由性,但是不可否认的是seaborn提供了良好的色彩搭配,使得获得高质量图形的代价大大降低。所以,对于熟悉matplotlib库的人来说,seaborn作为一个进阶或者偷懒学习是非常值得的。

seaborn是基于matplotlib实现的,所以,足够的了解matplotlib的面向对象的使用方法,对于学习seaborn是有着巨大帮助的。在seaborn中,它提供了一些比较特殊、高度定制化封装的绘图函数,其具有多功能性,但其高度封装使得其返回对象不再是matplotlib的aexs对象,所以使用上多多少少会有着一点差别。这几个函数主要是relplot()lmplot()等,当然这两个可能是使用较为频繁的。

relplot()的认识

relplot,顾名思义就是进行关系relationship的绘图,它即可以进行line的绘制,也可以进行scatter散点图的绘制。但是需要注意的是relplot最大的一点是,它返回的对象object不是matplotlib的axes对象,而是seaborn自己定义的叫作FaceGrid的一个对象,因此,matplotlib中对于图形参数设置的OOP语法形式是不能直接使用的,若想设置属性,必须参照seaborn给出的FaceGrid的方法使用说明进行。

seaborn绘图时,数据采用dataframe形式是最为方便的,当然这需要使用者前期进行好数据的清洗和整理,seaborn本身也能够直接使用numpy数组形式的数据进行绘制,但此时无法最大程度的发挥出seaborn的全部特性和功能。为了方便进行演示,采用seaborn内置的数据进行绘图学习,这个可以通过sns.load_dataset("dataname")来完成使用,他返回的数据形式是pandas的DataFrame形式,所以最好是对pandas的操作要有一定程度的了解。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("dark")

导入seaborn的tips数据后,这个数据是关于酒店费用和预定情况的,其中total_bill是总费用,对应的tips是小费,而sex列是消费者的性别,这一列数据的数据类型是string,不是数值型数据。同样,smoker列是顾客是否抽烟的一个记录数据,也都不是数值型数据。最后的size列是人数的一个统计,人数当然是数值。relplot中,会自动针对数据类型的不同显示出不同效果。所以,对数据进行基本的认识也非常必要的

tips = sns.load_dataset("tips")
tips
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
... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2

<p>244 rows × 7 columns</p>

最简单的一种使用方式,就是直接调用,x轴和y轴直接进行数据的确定,relplot既可以提供line图也可以提供散点图,通过kind=参数可以进行调整,默认情况下是显示散点图。

sns.relplot(x="total_bill", y="tip", data=tips);

png

seaborn是高度定制化的,API常常具有丰富的功能,relplot中,hue这个参数可以进行进一步的数据细分,在同一个图中增加一个可视化的维度,当设置hue="smoker时,由于smoker中的数据表示要么抽烟要么不抽烟,此时绘图结果中会进行这一项的区别,即抽烟的和不抽烟的会显示出不同的颜色以便进行区分。

sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips);


png

采用散点图进行表达式,对于不同数据采用不同的标记形式可能是一个更好的方式,hue=通过颜色份区分数据,而style参数可以控制标记的形状,仍然以smoker列进行区分的化,结果如下:

sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips);


png

DataFrame中的数据类型的不同,会导致relplot的结果产生不同的效果,smoker列是非数值类的数据,当hue="size"进行时,由于size列的数据是数值型,因此,hue控制的颜色会产生类似于颜色映射图一样的效果,会针对不同的数值大小显示不同色度的效果。颜色越深,表示对应的size列的数据值越大。

sns.relplot(x="total_bill", y="tip", hue="size", data=tips);


png

scatter形式的图,对于数据的区分还可以通过点的大小来进行,如果值越大,那么对应的点的尺寸越大,这也是一种比较好的区分方式。此时可以通过relplotsize=参数来完成。

sns.relplot(x="total_bill", y="tip", hue="size", size="size", data=tips);


png

如果先要显示曲线图,可以设置kind="line来实现。

sns.relplot(x="total_bill", y="tip", kind='line', data=tips);

png

fmri = sns.load_dataset("fmri")
sns.relplot(x="timepoint", y="signal", kind="line", data=fmri);
sns.relplot(x="timepoint", y="signal", ci=None, kind="line", data=fmri);
sns.relplot(x="timepoint", y="signal", hue="event", kind="line", data=fmri);


png

png

png

relplot的特殊之处

relplot是一个高级的封装函数,能够实现line和scatter的绘图,而seaborn中的scatterplotlineplot函数分别能够进行专门的实现,relplot最大的不同在于,他返回的对象是seaborn的FaceGrid对象,而不是matplotlib的axes对象,relplot不接受ax的输入,但是scatterplot和lineplot是可以接受的,因此,这两个函数使用时以及设置图形属性时,与matplotlib的绘图基本一致。但是relplot函数如果要设置属性需要使用FaceGrid的方法进行。这是需要注意的。

seaborn中的高级绘图函数,要想充分的利用其功能性,对于事先数据的处理是十分重要的,一方面数据的准备要考虑到seaborn的特性,另一方面,需要对基本数据具有深入的认识和了解。

Archives Tip
QR Code for this page
Tipping QR Code