
4.2 Seaborn高级数据可视化
Seaborn是基于Matplotlib的高级绘图层。虽然Matplotlib包含饼图、直方图、三维图以及多图组合等基本工具,但是在使用时需要设置各种参数,而Seaborn简化了这一问题。它提供简单的代码来解决复杂的问题,尤其是多图组合的模式,不但作图清晰、美观,更是在同一图示中集合和对比了大量信息。这些工作如果只使用底层的Matplotlib实现,可能需要几倍甚至几十倍的代码量。另外,Seaborn还给我们提供了多种美观的图示风格,以及看问题的各种视角。综上,Saeborn的主要优点是简单、美观且多视角。
上一节已经介绍过常用的图表类型,本节将以数据为导向,介绍几种常用的Seaborn图表及使用场景。
4.2.1 准备工作
1.安装软件
在安装Seaborn库时需要注意其中的一些功能,比如catplot功能只有0.9版本以上的Seaborn才能支持,因此在安装时需要指定版本号。

2.包含头文件
在4.2节中所有示例都需要包括以下头文件,在此统一说明,后续例程中省略。

tips中有两个数值型字段和五个分类型字段,共244个实例,表4.2只截取了前5个作为示例。
表4.2 tips数据示例

4.2.2 连续变量相关图
本小节介绍一个连续变量与另一个连续变量之间关系的图表展示。
1.Relplot关系类型图表
Relplot可以支持点图kind='scatter'和线图kind='line'两种作图方法。下例把sex,time,day,tip,total_bill五维数据绘制在一张图上,两个数值类型tip和total_bill分别对应y轴和x轴,其他三个维度是枚举型变量,分别用hue设置颜色、col设置行、row设置列。Seaborn的大多数函数都支持使用这几个参数实现多图对比。

程序运行结果如图4.21所示。

图4.21 Relplot图表
2.点图
点图在上面的维度之上增加了点大小的维度(此维度为数值型)。

3.线图
线图使用style参数,也增加了用不同线(实线、虚线)表示不同类型的新维度(此维度为分类型)。

4.2.3 分类变量图
分类变量图描述的是连续变量在分类之后,其类与类之间的对比关系。
1.stripplot散点图
stripplot展示的是使用分类变量day分类后,对各类的连续变量total_bill的统计作图。

程序运行结果如图4.22所示。

图4.22 stripplot散点图
2.swarmplot散点图
swarmplot的功能和stripplot的类似,为避免重叠而无法估算数量的多少,swarmplot将每个点散开,这样做的缺点是耗时,因此当数据量非常大的时候并不适用。

程序运行结果如图4.23所示。

图4.23 swarmplot散点图
3.violinplot小提琴图
为展示具体的分布,Seaborn还支持小提琴图。在本例中,按不同day分类并在每个图上用小提琴图画出不同性别的total_bill核密度分布图。

程序运行结果如图4.24所示。

图4.24 volinplot小提琴图
4.boxplot箱式图
boxplot箱式图也称盒须图或盒式图,用于描述一组数据的分布情况。

程序运行结果如图4.25所示。

图4.25 boxplot箱式图
5.boxenplot变种箱式图
boxenplot变种箱式图也被称为增强箱式图,在图中使用更多分位数绘制出更丰富的分布信息,尤其细化了尾部数据的分布情况。

程序运行结果如图4.26所示。

图4.26 boxenplot变种箱式图
6.pointplot分类统计图
pointplot分类统计图中的横坐标代表类别,纵坐标展示了该类别对应值的分布。与箱式图不同的是,它以连接的方式描述类别之间的关系,更适用于多个有序的类别。

程序运行结果如图4.27所示。

图4.27 pointplot分类统计图
7.barplot柱对比图
barplot柱对比图可用于对比两种分布的均值和方差,本例展示了在不同性别、不同吸烟情况的人群中,total_bill均值和方差的差异。

程序运行结果如图4.28所示。

图4.28 barplot柱对比图
8.catplot综合分析图
catplot综合分析图可以实现本小节所有分类变量图的功能,可通过kind设置不同的图表类型。
◎ stripplot():catplot(kind="strip").
◎ swarmplot():catplot(kind="swarm").
◎ boxplot():catplot(kind="box").
◎ violinplot():catplot(kind="violin").
◎ boxenplot():catplot(kind="boxen").
◎ pointplot():catplot(kind="point").
◎ barplot():catplot(kind="bar").
◎ countplot():catplot(kind="count").
4.2.4 回归图
1.连续变量回归图
implot是在散点图的基础上加入回归模型的绘图方法。

程序运行结果如图4.29所示。

图4.29 implot连续变量回归图
2.分类变量回归图
分类变量回归图可以使用参数x_estimator=np.mean对每个类别的统计量作图。

程序运行结果如图4.30所示。

图4.30 implot分类变量回归图
4.2.5 多图组合
1.jointplot两变量图
在数据分析中,常用作图的方式实现相关性分析,即x轴设置为变量A,y轴设置为变量B,然后做散点图。在散点图中,点是叠加显示的,但有时还需要关注每个变量自身的分布情况,而jointplot可以把描述变量的分布图和变量相关的散点图组合在一起,是相关性分析最常用的工具。另外,图片上还能展示回归曲线以及相关系数。

程序运行结果如图4.31所示。

图4.31 jointplot两变量图
本例中使用statsmodels库的ccard数据分析其中两个数值类型变量的相关性,使用xlim和ylim设置图片显示范围,忽略了离群点,kind参数可设置作图方式,如scatter散点图、kde密度图、hex六边形图等,本例中选择reg画出了线性回归图。
2.pairplot多变量图
如果对N个变量的相关性做散点图,maplotlib则需要做N×N个图,而pairplot函数调用一次即可实现,其对角线上是直方图,其余都是两两变量的散点图,这样不仅简单,而且还能组合在一起做对比。

程序运行结果如图4.32所示。

图4.32 pairplot多变量图
从图4.32中可以看到,数据类型INCOME与INCOMESQ呈强相关,AGE与INCOME也有一定的相关趋势,对角线上的图对应的是每个因素与其自身的对比,图4.32中以直方图的形式显示了该变量的分布。
3.factorplot两变量关系图
factorplot用于绘制两维变量的关系图,用kind指定其做图类型,包括point,bar,count,box,violin,strip等。

程序运行结果如图4.33所示。

图4.33 factorplot两变量关系图
4.FacetGrid结构化绘图网格
FacetGrid可以选择任意作图方式以及自定义的作图函数。这通常包含两部分:FacetGrid部分指定数据集、行、列,map部分指定作图方式及相应参数。

程序运行结果如图4.34所示。

图4.34 facetgrid绘图网络
可以看到,不论是连续图还是分类图,不论是用FacetGrid还是用barplot都是将多个特征放在同一张图片上展示,其差别在于观察角度不同和数据自身的类型。
4.2.6 热力图
热力图(heatmap)也常用来展示数据表中多个特征的两两线性相关性,尤其在变量的数量较多时,它比pairplot更直观,也更加节约计算资源。

程序运行结果如图4.35所示。

图4.35 热力图
4.2.7 印刷品作图
用Matplotlib或Seaborn生成的图片除了用于开发者分析数据、作PPT展示,往往还用于纸制品的印刷。例如,制作成书籍中的图片或者发布论文等。在用于印刷时,图片需要有足够的分辨率,在4.1.10小节中介绍了将图表导出成图片以及设置图片分辨率的方法。
除了考虑图片分辨率,还需要考虑出版物中字体的大小及版面的大小,以调整图片中文字的大小,这在创建绘图区域时可以使用不同的figsize。对于非彩色印刷,还需要注意其背景颜色不能太深,以及需要将图表中不同的颜色(当红、绿、蓝图转成黑白图时,都变成了相似的深灰色)转换成不同亮度的单色。下面介绍Seaborn中常用的两种方法:
第一种:将背景设置为白色加网格。

第二种:将默认的用颜色表示的不同类型设置为单色,由深到浅表示不同的类型。

其中,start=2.7设置作图颜色为蓝色;dark和light设置灰度变化范围,其取值为0到1之间。由于太深和太浅的颜色效果都比较突兀,因此一般取其中段,n_colors=10指定将其颜色范围分为十段。