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);
seaborn是高度定制化的,API常常具有丰富的功能,relplot
中,hue这个参数可以进行进一步的数据细分,在同一个图中增加一个可视化的维度,当设置hue="smoker
时,由于smoker中的数据表示要么抽烟要么不抽烟,此时绘图结果中会进行这一项的区别,即抽烟的和不抽烟的会显示出不同的颜色以便进行区分。
sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips);
采用散点图进行表达式,对于不同数据采用不同的标记形式可能是一个更好的方式,hue=
通过颜色份区分数据,而style
参数可以控制标记的形状,仍然以smoker列进行区分的化,结果如下:
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips);
DataFrame中的数据类型的不同,会导致relplot
的结果产生不同的效果,smoker列是非数值类的数据,当hue="size"
进行时,由于size列的数据是数值型,因此,hue控制的颜色会产生类似于颜色映射图一样的效果,会针对不同的数值大小显示不同色度的效果。颜色越深,表示对应的size列的数据值越大。
sns.relplot(x="total_bill", y="tip", hue="size", data=tips);
scatter形式的图,对于数据的区分还可以通过点的大小来进行,如果值越大,那么对应的点的尺寸越大,这也是一种比较好的区分方式。此时可以通过relplot
的size=
参数来完成。
sns.relplot(x="total_bill", y="tip", hue="size", size="size", data=tips);
如果先要显示曲线图,可以设置kind="line
来实现。
sns.relplot(x="total_bill", y="tip", kind='line', data=tips);
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);
relplot
的特殊之处
relplot是一个高级的封装函数,能够实现line和scatter的绘图,而seaborn中的scatterplot
和lineplot
函数分别能够进行专门的实现,relplot最大的不同在于,他返回的对象是seaborn的FaceGrid对象,而不是matplotlib的axes对象,relplot不接受ax的输入,但是scatterplot和lineplot是可以接受的,因此,这两个函数使用时以及设置图形属性时,与matplotlib的绘图基本一致。但是relplot函数如果要设置属性需要使用FaceGrid的方法进行。这是需要注意的。
seaborn中的高级绘图函数,要想充分的利用其功能性,对于事先数据的处理是十分重要的,一方面数据的准备要考虑到seaborn的特性,另一方面,需要对基本数据具有深入的认识和了解。
本站文章如非特别说明,均为原创。未经本人同意,请勿转载!转载请务必注明出处!