Python数据可视化之美:专业图表绘制指南(全彩)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 Seaborn

Seaborn同matplotlib一样,也是Python进行数据可视化分析的重要的第三方包。但是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下,使用Seaborn能绘制具有吸引力的图表,而使用matplotlib却能绘制出具有更多特色的图表。应该把Seaborn视为matplotlib的补充,而不是替代物。Seaborn的默认导入语句为:

3.2.1 常见图表类型

Searborn在matplotlib的基础上,侧重数据统计分析图表的绘制,包括带误差线的柱形图和散点图、箱形图、小提琴图、一维和二维的统计直方图和核密度估计图等(见链接2)。另外,可以将多数据系列直接映射到颜色(hue)、大小(size)、数据标记(style)等,相比matplotlib绘图,这样可以很好地简化代码。Seaborn常见图表类型及其核心参数说明如表3-2-1所示,主要包括数据分布型(一维和二维的统计直方图、核密度估计图等)、类别比较型(抖动散点图、蜂巢图、带误差棒的散点图、带误差棒的柱形图、箱形图、小提琴图等)、数据关系型(折线图、散点图以及带拟合线的散点图、热力图等)等图表。这些图表大部分也都能使用plotnine绘制实现,相对于Seaborn,plotnine的绘图语法更加简洁与人性化,所以推荐优先使用plotnine绘制。

表3-2-1 Seaborn常见图表类型及其核心参数说明

续表

3.2.2 图表风格与颜色主题

相比matplotlib,Seaborn的另外一个优势就是可以快速设定图表颜色主题与风格。Seaborn可以使用如下语句设置:

Seaborn将matplotlib图表的参数划分为两个独立的组合:第一组设置绘图的外观风格;第二组主要将绘图的各种元素按比例缩放,以使其可以嵌入不同的背景环境中。如果需要将图表风格重置到默认状态,则可以使用:sns.set()。

● Seaborn可供选择的图表风格(figure_style)有darkgrid、whitegrid、dark、white和ticks。如果需要定制Seaborn风格,则可以将一个字典参数传递给set_style()或axes_style()的参数rc,具体参数设置方法可见Seaborn的官方教程。

● 缩放Seaborn的绘图元素,有4个预置的环境类型(context_tyle),按大小从小到大排列分别为:paper、notebook(默认)、talk、poster,还可以通过一个字典参数值来覆盖参数,具体参数设置方法可参见Seaborn的官方教程。

图表的颜色主题(color_palette)由sns.set_palette()控制,其颜色主题主要分为多色系(qualitative)、双色渐变系(diverging)和单色渐变系(sequential)。有时候我们需要获取不同颜色主题方案的数值,可以使用如下语句:

R语言ggplot2默认的颜色主题方案的颜色为:

其中,n_colors表示欲获取的颜色数目,当n_colors=8时,颜色主题为。由于Seaborn只是对matplotlib的封装,所以通过sns.*()函数设置的图表风格与颜色主题,对matplotlib绘图同样有效。关于颜色主题的选择与应用将在后面的章节详细讲解。图3-2-1展示了使用Seaborn绘制带标记的曲线图的案例,该案例使用了与图3-1-3例相同的数据源,方便可以读者对比两种绘图语法的区别。

图3-2-1 使用Seaborn绘制带标记的曲线图

图3-2-1 使用Seaborn绘制带标记的曲线图(续)

3.2.3 图表的分面绘制

相比matplotlib,Seaborn还有一个很好的优势,即图表的分面展示。Seaborn常用的分面函数有sns.FacetGrid()、sns.PairGrid()等。

● FacetGrid:当需要在数据集的子集中分别可视化变量的分布或多个变量之间的关系时,sns.FacetGrid()函数非常有用。FacetGrid可以绘制多三个维度:row、col、hue(行、列、色调)。前两个与得到的轴阵列有明显的对应关系;将色调变量视为沿深度轴的第三个维度,其中不同的级别用不同的颜色绘制。在大多数情况下,使用图形级别功能,如relplot()或catplot()函数,比直接使用FacetGrid更好。

● PairGrid:它可以使用相同的绘图类型快速绘制子图的网格,以可视化每个子图中的数据。在一个PairGrid中,每个行和列都分配给不同的变量,因此结果图显示数据集中的每个成对关系。特别适用于散点图矩阵,这是显示每种关系的最常用方式,但PairGrid不限于散点图。有时候,pairplot()函数可以使绘图更灵活,速度更快。

FacetGrid与PairGrid的区别:在FacetGrid中,每个方面都表现出以不同级别的其他变量为条件的相同关系。在PairGrid中,每个图显示不同的关系(尽管上三角和下三角将具有镜像图)。使用PairGrid可以将数据集中的有趣关系非常快速、非常高级地展示。该类的基本用法与FacetGrid非常相似。首先初始化网格,然后将绘图函数传递给map()方法,并在每个子图上调用它。图3-2-2所示是使用sns.FacetGrid()函数实现的按״variable״分面的曲线图。

图3-2-2 使用Seaborn绘制带标记的分面曲线图

相比Seaborn的分面绘图,plotnine可以与绘图函数结合,更加简洁地实现分面绘图。所以大部分情况下,推荐优先使用plotnine实现分面绘图。图3-2-2的实现代码如下所示。