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

3.3 plotnine

R语言数据可视化的强大之处在于ggplot2(见链接3),它是一个功能强大且灵活的R包,由Hadley Wickham编写,其用于生成优雅的图形。ggplot2中的gg表示图形语法(grammar of graphics),这是一个通过使用“语法”来绘图的图形概念。

plotnine(见链接4)就是Python版的ggplot2,语法与R语言的ggplot2基本一致。plotnine主张模块间的协调与分工,整个plotnine的语法框架如图3-3-1所示,主要包括数据绘图部分与美化细节部分。plotnine与R语言ggplot2的图形语法具有几乎相同的特点。

图3-3-1 plotnine语法框架

(1)采用图层的设计方式,有利于使用结构化思维实现数据可视化。有明确的起始(ggplot()开始)与终止,图层之间的叠加是靠“+”实现的,越往后,其图层越在上方。通常,一个geom_×××()函数或stat_×××()函数可以绘制一个图层。

(2)将表征数据和图形细节分开,能快速将图形表现出来,使创造性的绘图更加容易实现。而且可以通过stat_×××()函数将常见的统计变换融入绘图中。

对于Plotnine包,可使用“pip install plotnine”语句安装,其他具体安装方法可见官方网站。在Python中默认的导入语句为:

如果要导入plotnine包自带的数据集,则可以使用如下语句:

plotnine绘图的基本语法结构与R语言的ggplot2基本一致,如图3-3-2所示。其中必需的图表输入信息如下。

图3-3-2 plotnine绘图的基本语法结构

(1)ggplot():底层绘图函数。DATA为数据集,主要是数据框(data.frame)格式的数据集;MAPPING表示变量的映射,用来表示变量X和Y,还可以用来控制颜色(color)、大小(size)或形状(shape)。

(2)geom_×××()|stat_×××():几何图层或统计变换,比如常见的散点图geom_point()、柱形图geom_bar()、统计直方图geom_histogram()、箱形图geom_boxplot()、折线图geom_line()等。我们通常使用geom_×××()就可以绘制大部分图表,有时候通过设定stat参数可以先实现统计变换。

plotnine中可选的图表输入信息包括如下5个部分,主要用于实现对图表的美化与变换等。

(1)scale_×××():度量调整,调整具体的度量,包括颜色(color)、大小(size)或形状(shape)等,跟MAPPING的映射变量相对应。

(2)coord_×××():笛卡儿坐标系,plotnine暂时还不能实现极坐标系和地理空间坐标系,这是它最大的一块短板。

(3)facet_×××():分面系统,将某个变量进行分面变换,包括按行、按列和按网格等形式分面绘图。

(4)guides():图例调整,主要包括连续型和离散型两种类型的图例。

(5)theme():主题设定,主要是调整图表的细节,包括图表背景颜色、网格线的间隔与颜色等。

3.3.1 geom_×××()与stat_×××()

1.几何对象函数:geom_xxx()

plotnine包中包含几十种不同的几何对象函数geom_×××()和统计变换函数stat_×××()。平时,我们主要是使用几何对象函数geom_×××(),只有当绘制图表涉及统计变换时,才会使用统计变换函数stat_×××(),比如绘制带误差线的均值散点图或柱形图等。geom_point()函数绘制的散点图与气泡图如图3-3-3所示,plotnine默认使用直角坐标系。

图3-3-3 geom_point()函数的绘制过程

根据函数输入的变量总数与数据类型(连续型或离散型),我们可以将大部分函数大致分成3个大类,6个小类,如表3-3-1所示。每个plotnine函数的具体参数可以查看plotnine(见链接5)或者ggplot2(见链接6)的官方手册。

表3-3-1 plotnline绘图函数的分类

有两类函数没有囊括在表3-3-1中,如下。

(1)图元(graphical primitives)系列函数:geom_curve()、geom_path()、geom_polygon()、geom_rect()、geom_ribbon()、geom_linerange()、geom_abline()、geom_hline()、geom_vline()、geom_segment()、geom_spoke(),这些函数主要用于绘制基本的图表元素,比如矩形方块、多边形、线段等,可以供用户创造新的图表类型。

(2)误差(error)展示函数:geom_crossbar()、geom_errorbar()、geom_errorbarh、geom_pointrange()可以分别绘制误差框、竖直误差线、水平误差线、带误差棒的均值点。这些函数需要先设置统计(stat)变换参数,才能自动根据数据计算得到均值与标准差。

2.统计变换函数:stat_xxx()

统计变换函数(stat_xxx())在数据被绘制出来之前对数据进行聚合和其他计算。stat_×××()确定了数据的计算方法。不同方法的计算会产生不同的结果,所以一个stat_×××()函数必须与一个geom_×××()函数对应进行数据的计算,如图3-3-4所示。在制作某些特殊类型的统计图形时(比如柱形图、直方图、平滑曲线图、概率密度曲线、箱形图等),数据对象在向几何对象的视觉信号映射过程中,会做特殊转换,也称统计变换过程。为了让作图者更好地聚焦于统计变换过程,将该图层以同效果的stat_×××()命名可以很好地达到聚焦注意力的作用。

图3-3-4 stat_count()函数的绘制过程

我们应将geom_×××()(几何对象函数)和stat_×××()(统计变换函数)都视作图层。大多成对出现的geom_×××()和stat_×××()完成的绘图效果是一样的,但是并非全部都一样。每一个图层都包含一个几何对象和一个统计变换,也即每一个geom_×××开头的几何对象都含有一个stat(统计变换)参数,同时每一个stat_×××开头的几何对象都拥有一个geom(几何对象)参数。但是为什么要分开命名呢,难道不是多此一举吗?

● 以stat_×××()(统计变换函数)开始的图层,在制作这些特殊统计图形时,我们无须设定统计变换参数(因为函数开头名称已经声明),但需指定集合对象名称的图表类型geom,这样能绘制与之对应的统计类型的图表。变换geom_×××()函数,可以根据统计变换结果绘制不同的图表,使得作图过程更加侧重统计变换过程。

● geom_×××(几何对象函数)绘制的图层,更加侧重图表类型的绘制,而通过修改统计变换参数(stat),也可以实现绘图前数据的统计变换,比如绘制均值散点图,下面语句(a1)和语句(b1)实现的效果都是一样的,语句(a1)是使用指定geom="point"(散点)的stat_summary()语句,而语句(b1)是使用指定stat="summary"的geom_point()语句。

下面代码为绘制带误差线的散点图,语句(a2)和语句(b2)实现的效果也是一样的,语句(a2)使用指定geom="pointrange"(带误差线的散点)的stat_summary()语句,语句(b2)使用指定stat="summary"的geom_pointrange()语句。

其中,fun.data表示指定完整的汇总函数,输入数字向量,输出数据框,常见4种为mean_cl_boot、mean_cl_normal、mean_sdl、median_hilow。fun.y表示指定对y的汇总函数,同样是输入数字向量,返回单个数字median或mean等,这里的y通常会被分组,汇总后是每组返回1个数字。

当绘制的图表不涉及统计变换时,我们可以直接使用geom_×××()函数,也无须设定stat参数,因为会默认stat="identity"(无数据变换)。只有涉及统计变换处理时,才需要使用更改stat的参数,或者直接使用stat_×××()以强调数据的统计变换。

3.3.2 美学参数映射

plotnine可用作变量的美学映射参数主要包括color/col/colour、fill、size、angle、linetype、shape、vjust和hjust,其具体说明如下所示。需要注意的是,有些美学映射参数只适应于类别型变量,比如linetype、shape。

(1)color/col/colour、fill和alpha,属性都是与颜色相关的美学参数。其中,color/col/colour是指点(point)、线(line)和填充区域(region)轮廓的颜色;fill是指定填充区域(region)的颜色;alpha是指定颜色的透明度,数值范围是从0(完全透明)到1(不透明)。

(2)size是指点(point)的尺寸或线的(line)宽度,默认单位为mm,可以在geom_point()函数绘制的散点图基础上,添加size的映射,从而实现气泡图。

(3)angle是指角度,只有部分几何对象有,如geom_text()函数中文本的摆放角度、geom_spoke()函数中短棒的摆放角度。

(4)vjust和hjust都是与位置调整有关的美学参数。其中,vjust是指垂直位置微调,在(0,1)区间的数字或位置字符串:0="buttom",0.5="middle",1="top",区间外的数字微调比例控制不均;hjust是指水平位置微调,在(0,1)区间的数字或位置字符串:0="left",0.5="center",1="right",区间外的数字微调比例控制不均。

(5)linetype是指定线条的类型,包括白线(0="blank")、实线(1="solid")、短虚线(2="dashed")、点线(3="dotted")、点横线(4="dotdash")、长虚线(5="longdash")、短长虚线(6="twodash");

(6)shape是指点(point)的形状,为[0,25]区间的26个整数,分别对应方形、圆形、三角形、菱形等26种不同的形状,如图3-3-5所示。只有21到26号点型有填充颜色(fill)的属性,其他都只有轮廓颜色(color)的属性。

图3-3-5 Python中plotnine 和matplotlib可供选择的形状

plotnine中的geom_×××()系列函数,其基础的展示元素可以分成4类:点(point)、线(line)、多边形(polygon)和文本(text),plotnine常见函数的主要美学参数映射如表3-3-2所示。

表3-3-2 plotnine常见函数的主要美学映射参数

图3-3-7所示为同一数据集的不同美学映射参数效果。使用pd.read_csv()函数:df=pd.read_csv("Facet_Data.csv"),可以读入数据集df。df有4列:tau、SOD、age和Class(Control、Impaired和Uncertain),其数据框前6行如图3-3-6所示。

图3-3-6

图3-3-7都是使用geom_point()函数绘制的,其参数包括x、y、alpha(透明度)、colour(轮廓颜色)、fill(填充颜色)、group(分组映射的变量)、shape(散点的形状)、size(散点的大小)、stroke(轮廓粗细)。图3-3-7(a)是将离散数值型变量age映射到散点的大小(size),然后散点图转换成气泡图,气泡的大小对应age的数值;图3-3-7(b)是将age映射到散点的大小(size)和填充颜色(fill),plotnine会自动将填充颜色映射到颜色条(colorbar);图3-3-7(c)是将离散类别型变量Class映射到点的填充颜色(fill),plotnine会自动将不同的填充颜色对应类别的数据点,从而绘制多数据系列的散点图;图3-3-7(d)是将离散数值型变量age和离散类别型变量Class分别映射到散点的大小(size)和填充颜色(fill)。

图3-3-6 不同的美学参数映射效果

另外,还有不用作变量,但又比较重要的美学映射参数:字体(family)和字型(fontface)。其中,字型分为plain(常规体)、bold(粗体)、italic(斜体)、bold.italic(粗斜体),常用于geom_text等文本对象。字体内置的只有3种:sans、serif、mono,不同的字体(family)和字型(fontface)组合如图3-3-8所示。

图3-3-8 不同的字体的格式

图表中需要使用中文字符时,可以使用如下代码修改字体的显示。否则,绘制的图表可能会出现文本乱码。

3.3.3 度量调整

度量用于控制变量映射到视觉对象的具体细节,比如:X轴和Y轴、colour(轮廓颜色)、fill(填充颜色)、alpha(透明度)、linetype(线形状)、shape(形状)和size(大小)等,它们都有相应的度量函数,如表3-3-3所示。根据美学映射参数的变量属性,将度量调整函数分成数值型和类别型两大类。plotnine的默认度量为scale_×××_identity()。需要注意的是:scale_*_manual()表示手动自定义离散的度量,包括color、fill、alpha、linetype、shape和size等美学映射参数。

在表3-3-3 plotnine常见度量调整函数中,X轴和Y轴度量用于控制坐标轴的间隔与标签的显示等信息。颜色作为数据可视化中尤为重要的部分,轮廓色度量color和填充颜色度量fill会在讲解3.4节进行详细介绍。在实际的图表绘制中,我们很少使用透明度度量alpha,因为这很难观察到透明度的映射变化。

表3-3-3 plotnine常见度量调整函数

图3-3-9所示为散点图的不同度量的调整效果,图3-3-9(a)是将数值离散型变量age映射到散点的大小(size),再使用scale_size(range=(a,b))调整散点大小(size)的度量,range表示美学映射参数变量转化后气泡面积的映射显示范围。图3-3-9(b)是在图3-3-9(a)的基础上添加了颜色的映射,使用scale_fill_distiller(type='seq',palette='reds')函数将数值离散型变量age映射到红色渐变颜色条。图3-3-9(c)是将类别离散型类别变量Class映射到不同的填充颜色(fill)和形状(shape),使用scale_*_manual()手动自定义fill和shape的度量。图3-3-9(d)是将数值离散型变量age和类别离散型变量Class分别映射到点的大小(size)和填充颜色(fill),然后scale_size()和scale_fill_manual()分别调整散点大小(size)的映射范围与填充颜色(fill)的颜色数值。

图3-3-9 散点图的不同度量的调整效果

这里关键是要学会合理地使用美学映射参数,并调整合适的度量。可视化最基本的形式就是简单地把数据映射成彩色图形。它的工作原理就是大脑倾向于寻找模式,你可以在图形和它所代表的数字间来回切换。1985年,AT&T贝尔实验室的统计学家威廉·克利夫兰(William Cleveland)和罗麦吉尔(Robert McGill)发表了关于图形感知和方法的论文[1]。研究焦点是确定人们理解上述视觉暗示(不包括形状)的精确程度,最终得出如图3-3-10所示从最精确到最不精确的排序清单。图3-3-10展示了数值型数据使用不同视觉暗示的精确程度排序。

图3-3-10 克利夫兰和麦吉尔的视觉暗示排序[1]

我们能用到的视觉暗示通常有长度、面积、体积、角度、位置、方向、形状和颜色。所以能否正确地选择视觉暗示就取决于你对形状、颜色、大小的理解,以及数据本身和目标。不同的图表类型应该使用不同的视觉暗示,合理的视觉暗示组合能更好地促进读者理解图表的数据信息。如图3-3-11所示,相同的数据系列采用不同的视觉暗示组合共有6种,分析结果如表3-3-4所示。

表3-3-4 图3-3-11系列图表的视觉暗示组合分析结果

根据表3-3-4可知,图3-3-11(f)是最优的视觉暗示组合结果,既能保证很容易区分数据系列,也能保证图表美观,同时也适应于彩色与黑白两种印刷方式。当图3-3-11(f)采用黑白印刷时,色相视觉暗示会消除,只保留位置+方向+形状,如图3-3-11(c)所示,但是这样也能容易区分数据系列,保证读者对数据信息的正确、快读理解。表3-3-5展示了图3-3-11系列图表的视觉暗示组合代码与说明。

图3-3-11 不同视觉暗示的组合结果

表3-3-5 图3-3-10系列图表的视觉暗示组合代码与说明

在表3-3-5中,我们需要重点理解fill、color、size、shape等美学映射参数位置何时应该在aes()内部,何时应该在aes()外部:

● 当我们指定的美学映射参数需要进行个性化映射时(即一一映射),应该写在aes()函数内部,即每一个观测值都会按照指定的特定变量值进行个性化设定。典型情况是需要添加一个维度,将这个维度按照颜色、大小、线条等方式针对维度向量中的每一个记录值进行一一设定。

● 当我们需要统一设定某些图表元素对象(共性、统一化)时,此时应该将其参数指定在aes()函数外部,即所有观测值都会按照统一属性进行映射,例如size=5,linetype="dash",color="blue"。典型情况是需要统一所有的点大小、颜色、形状、透明度或者线条颜色、粗细、形状等。这种情况下不会消耗数据源中的任何一个维度或者度量指标,仅仅是对已经呈现出来的图形图素的外观属性做了统一设定。

高手必备

特别强调的是,要想熟练使用plotnine绘制图表,就必须深入理解ggplot与geom对象之间的关系。在实际绘图语句中存在如表3-3-7所示的3种情况。表中的案例为数据集使用向量排序函数sort()和正态分布随机数生成函数rnorm()构造的df1和df2,主要代码如下:

在plotnine中,ggplot与geom对象之间的关系主要体现在如下两点。

● ggplot(data=NULL,mapping=aes()):ggplot内有data、mapping两个参数,具有全局优先级,可以被之后的所有geom对象继承(前提是geom内未指定相关参数)。

● geom_×××(data=NULL,mapping=aes()):geom对象内同样有data和mapping参数,但geom内的data和mapping参数属于局部参数,仅作用于geom对象内部。

表3-3-7 plotnine中ggplot与geom对象之间的关系情况

3.3.4 坐标系及其度量

直角坐标系(rectangular coordinates/cartesian coordinates),也叫作笛卡儿坐标系,是最常用的坐标系,如图3-3-12所示。我们平时经常绘制的条形图、散点图或气泡图,就是直角坐标系。坐标系所在平面叫作坐标平面,两坐标轴的公共原点叫作直角坐标系的原点。X轴和Y轴把坐标平面分成四个象限,右上面的叫作第一象限,其他三个部分按逆时针方向依次叫作第二象限、第三象限和第四象限。象限以数轴为界,横轴、纵轴上的点不属于任何象限。通常在直角坐标系中的点可以记为(x,y),其中x表示X轴的数值,y表示Y轴的数值。

图3-3-12 直角坐标系下的散点图和气泡图

plotnine的直角坐标系包括coord_cartesian()、coord_fixed()、coord_flip()和coord_trans()四种类型。plotnine默认为直角坐标系coord_cartesian(),其他坐标系都是通过直角坐标系画图,然后变换过来的。在直角坐标系中,可以使用coord_fixed()函数固定纵横比笛卡儿坐标系,在绘制华夫饼图和复合型散点饼图时,需要使用纵横比为1的笛卡儿坐标系:coord_fixed(ratio=1);

在绘制条形图或者水平箱形图时,需要使用coord_flip()函数翻转坐标系。它会将X轴和Y轴对换,从而可以将竖直的柱形图转换成水平的条形图。

在原始的笛卡儿坐标系上,坐标轴上的刻度比例尺是不变的,而coord_trans()坐标系的坐标轴刻度比例尺是变化的,这种坐标系应用很少,但不是没用,可以将曲线变成直线显示,如果数据点在某个轴方向的密集程度是变化的,则不便于观察,可以通过改变比例尺来调节,使数据点集中显示。

坐标系指定了可视化的维度,而坐标轴的度量则指定了在每一个维度里数据映射的范围。坐标轴的度量有很多种,你也可以用数学函数定义自己的坐标轴度量,但是基本上都属于图3-3-13所示的坐标轴度量。这些坐标轴度量主要分为3类,包括数字(侧重数据的对数变化)坐标轴度量、分类坐标轴度量和时间坐标轴度量。其中,数字坐标轴度量包括线性坐标轴度量、对数坐标轴度量、百分比坐标轴度量,而分类坐标轴度量包括分类坐标轴度量和顺序坐标轴度量。

图3-3-13 不同类型的标尺[2]

在plotnine的绘图系统中,数字坐标轴度量包括scale_x/y_continuous()、scale_x/y_log10()、scale_x/y_sqrt()、scale_x/y_reverse();分类坐标轴度量包括scale_x/y_discrete();时间坐标轴度量包括scale_x/y_date()、scale_x/y_datetime()、scale_x/y_time()。这些度量的主要参数包括:① name表示指定坐标轴名称,也将作为对应的图例名;② breaks表示指定坐标轴刻度位置,即粗网格线位置;③ labels表示指定坐标轴刻度标签内容;④ limits表示指定坐标轴显示范围,支持反区间;⑤expand表示扩展坐标轴显示范围;⑥ trans表示指定坐标轴变换函数,自带有exp、log、log10等,还支持scales包内的其他变换函数,如scales::percent()百分比刻度、自定义等。图3-3-14(b)就是在图3-3-14(a)的基础上添加了scale_x_continuous()和scale_y_continuous()以调整X轴和Y轴的刻度与轴名。

图3-3-14 直角坐标系度量的调整

线性坐标轴度量(linear scale)上的间距处处相等,无论其处于坐标轴的什么位置。因此,在尺度的低端测量两点间的距离,和在尺度高端测量的结果是一样的。然而,对数坐标轴度量(logarithmic scale)是一个非线性的测量尺度,用在数量有较大范围的差异时。像里氏地震震级、声学中的音量、光学中的光强度及溶液的pH值等。对数尺度以数量级为基础,不是一般的线性尺度,因此每个刻度之间的商为一定值。若数据有以下特性时,用对数尺度来表示会比较方便:

(1)数据有数量级的差异时,使用对数尺度可以同时显示很大和很小的数据信息。

(2)数据有指数增长或幂定律的特性时,使用对数尺度可以将曲线变为直线表示。

图3-3-15(a)的X轴和Y轴都为线性尺度,而图3-3-15(b)的X轴仍为线性尺度,将Y轴转变为对数尺度,可以很好地展示很大和很小的数据信息。

图3-3-15 坐标标尺的转换

分类坐标轴度量(categorical scale):数据不仅仅包括数值,有时候还包括类别,比如不同实验条件、实验样品等测试得到的数据。分类标尺通常和数字标尺一起使用,以表达数据信息。条形图就是水平X轴为数字标尺、垂直Y轴为分类标尺;而柱形图是水平X轴为分类标尺、垂直Y轴为数字标尺,如图3-3-16所示。plotnine使用语句coord_flip()就可以对换X轴和Y轴。条形图和柱形图一个重要的视觉调整参数就是分类间隔,但是它和数值没有关系(如果是多数据系列,则还包括一个视觉参数:系列重叠)。

图3-3-16 分类标尺与数字标尺的组合使用

注意 对于柱形图、条形图和饼图,最好将数据先排序后再进行展示。对于柱形图和条形图,将数据从大到小排序,最大的位置放置在最左边或者最上边。而饼图的数据要从大到小排序,最大的从12点位置开始。

常见的相关系数图的X、Y轴都为分类标尺,如图3-3-17所示。相关系数图一般都是三维及以上的数据,但是使用二维图表显示。其中,X、Y列为都为类别数据,分别对应图表的X、Y轴;Z列为数值信息,通过颜色饱和度、面积大小等视觉暗示表示。图3-3-17(a)使用颜色饱和度和颜色色相综合表示Z列数据;图3-3-17(b)使用方块的面积大小以及颜色综合表示Z列数据,从图中很容易观察到哪两组变量的相关性最好。

图3-3-17 分类标尺的使用

相关系数

相关系数(correlation coefficient)是用以反映变量之间相关关系密切程度的统计指标。它是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。

(1)简单相关系数:又叫相关系数或线性相关系数,一般用字母r表示,用来度量两个变量间的线性关系。图3-3-17中的相关系数图就是研究多个变量两两之间的简单相关关系的。

(2)复相关系数:又叫多重相关系数。复相关是指因变量与多个自变量之间的相关关系。例如,某种商品的季节性需求量与其价格水平、职工收入水平等现象之间呈现复相关关系。

(3)典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间的相关关系。

时间坐标轴度量(time scale):时间是连续的变量,你可以把时间数据画到线性度量上,也可以将其分成时刻、星期、月份、季节或者年份,如图3-3-18所示。时间是日常生活的一部分。随着日出和日落,在时钟和日历里,我们每时每刻都在感受和体验时间。所以我们会经常遇见时间序列的数据,时间序列的数据常用柱形图、折线图或者面积图表示,有时候使用极坐标图也可以很好地展示数据,因为时间往往存在周期性,以天(day)、周(week)、月(month)、季(season)或年(year)为一个周期。

图3-3-18 时间序列图表

plotnine的时间坐标轴度量函数主要有scale_×××_date()、scale_×××_datetime()和scale_×××_timedelta()。

3.3.5 图例

图例作为图表背景信息的重要组成部分,对图表的完整与正确表达尤为重要。plotnine的guide_colorbar()/guide_colourbar()用于调整连续变量的图例;guide_legend()用于离散型变量的图例,也可以用于连续型变量。

guides()将guide_colorbar和guide_legend两种图例嵌套进去,方便映射与处理,如guides(fill=guide_colorbar()),对多个图例共同处理的时候尤为有效。另外,我们也可以在scale_×××()度量中指定guide类型,guide="colorbar"或guide="legend"。

其中,尤为重要的部分是图例位置的设定,plotnine默认是将图例放置在图表的右边("right"),但是我们在最后添加的theme()函数中,legend.position设定图例的位置用。legend.position可以设定为"right"、"left"、"bottom"和"top"。

在使用plotnine绘图网过程中,控制图例在图中的位置,利用theme(legend.position)参数,该参数对应的设置为:"none"(无图例)、"left"(左边)、"right"(右边)、"bottom"(底部)、"top"(头部),legend.position也可以用两个元素构成的数值向量来控制,如(0.9,0.7),主要是设置图例在图表中间所在具体位置,而不是图片的外围。数值大小一般在0~1之间,超出数值往往导致图例隐藏。如果图例通过数值向量设定在图表的具体位置,那么最好同时设定图例背景(legend.background)为透明或者无。如图3-3-19所示,先使用theme_classic()内置的图表系统主题,再使用theme()函数调整图例的具体位置。图3-3-19(a)图例的默认设定语句如下:

上述语句表示将图例的背景设为白色填充的矩形,位置设定为图表的右边。图3-3-19(b)将图例的位置设定为图表内部的左上角,并将图例背景(legend.background)设置为无。其中(0.32,0.75)表示图例的位置放置在图表内部X轴方向20%、Y轴方向80%的相对位置。

图3-3-19 图例位置的调整

3.3.6 主题系统

主题系统包括绘图区背景、网格线、坐标轴线条等图表的细节部分,而图表风格主要是指绘图区背景、网格线、坐标轴线条等的格式设定所展现的效果。plotnine图表的主题系统主要对象包括文本(text)、矩形(rect)和线条(line)三大类,对应的函数包括element_text()、element_rect()、element_line(),另外还有element_blank()表示该对象设置为无,具体如表3-3-6所示。其中,我们使用比较多的系统对象是坐标轴的标签(axis_text_x、axis_text_y)、图例的位置与背景(legend_position和legend_background)。X轴标签(axis_text_x)在绘制极坐标系柱形图和径向图时会用于调整X轴标签的旋转角度,Y轴标签(axis_text_y)也会用于时间序列峰峦图的Y轴标签的替换等,具体可见后面图表案例的讲解。

表3-3-6 主题系统的主要对象

plotnine自带的主题模板也有多种,包括theme_gray()、theme_minimal()、theme_bw()、theme_light()、theme_matplotlib()、theme_classic()等。相同的数据及数据格式,可以结合不同的图表风格,如图3-3-20所示。下面挑选几种具有代表性的图表风格进行讲解。

(1)图3-3-20(a)是R ggplot2风格的散点图,使用Set3的颜色主题,绘图区背景填充颜色为RGB(229,229,229)的灰色,以及白色的网格线[主要网格线的颜色为RGB(255,255,255),次要网格线的颜色为RGB(242,242,242)]。这种图表风格给读者清新脱俗的感觉,推荐在PPT演示中使用。

(2)图3-3-20(d)的绘图区背景填充颜色为RGB(255,255,255)的白色,无主要和次要网格线,没有过多的背景信息。当图表尺寸较小时,任然可以清晰地表达数据内容,不像图3-3-20(b)会因为背景线条太多而显得凌乱,常应用在学术期刊的论文中展示数据。

(3)图3-3-20(e)在图3-3-20(d)的基础上,将绘图区边框设置为“无”,也没有主要和次要网格线,同样常应用在学术期刊的论文中展示数据。

所以,总地来说,图3-3-20(a)和图3-3-20(b)的风格适合用于PPT演示,图3-3-20(d)和图3-3-20(e)适合用于学术论文展示。其实,不管使用R语言、Python,还是Origin、Excel,都可以通过调整绘图区背景、主要和次要网格线、坐标轴线条等的格式,实现如图3-3-20所示的6种不同的图表风格。

图3-3-20 不同的图表风格

3.3.7 分面系统

我们用三维图表表示三维或者四维数据时,可能不容易清晰地观察数据规律与展示数据信息。所以,可以引入分面图的形式展示数据。plotnine有两个很有意思的函数:facet_wrap()和facet_grid(),这两个函数可以根据类别属性绘制一些系列子图,类似于邮票图(small multiples),大致可以分为:矩阵分面图(见图9-2-4矩阵分面气泡图)、行分面图(见图5-5-2行分面的带填充的曲线图)、列分面图(见图9-2-2列分面的散点图和图9-2-3列分面的气泡图)。分面图就是根据数据类别按行或者列,使用散点图、气泡图、柱形图或者曲线图等基础图表展示数据,揭示数据之间的关系,可以适应4~5种数据结构类型。分面函数facet_grid()和facet_wrap()的核心语法如下所示。

上述代码中,rows表示要进行行分面的变量,如rows=vars(drv)表示将变量drv作为维度进行行分面,可以使用多个分类变量;cols表示要进行列分面的变量,如cols=vars(drv)表示将变量drv作为维度进行列分面,可以使用多个分类变量;scales表示分面后坐标轴适应规则,其中,"free"表示调整X轴和Y轴,"free_x"表示调整X轴,"free_y"表示调整Y轴,"fixed"表示X轴和Y轴的取值范围统一;facets表示将哪些变量作为维度进行分面,在网格分面中,尽量不使用,而使用rows和cols参数。plotnine分面系统的说明如表3-3-8所示,其中t的绘图内容为mpg数据集的多数据系列散点图,具体实现代码如下所示。

表3-3-8 plotnine分面系统的说明

3.3.8 位置调整

在geom_×××()函数中,参数position表示绘图数据系列的位置调整,默认为"identity"(无位置调整),这个参数在绘制柱形图和条形图系列时经常用到,以绘制簇状柱形图、堆积柱形图和百分比堆积柱形图等。plotnine的位置调整参数如表3-3-9所示。在柱形图和条形图系列中,position的参数有4种——① identity:不做任何位置的调整,该情况在多分类柱形图中不可行,序列间会存在遮盖问题,但是在多序列散点图、折线图中可行,不存在遮盖问题;② stack:垂直堆叠放置(堆积柱形图);③ dodge:水平并列放置(簇状柱形图,position=position_dodge());④ fill:百分比填充(垂直堆叠放置,如百分比堆积面积图、百分比堆积柱形图等)。

表3-3-9 plotnine绘图语法中的位置调整参数

图3-3-21显示了箱形图和抖动散点图的位置调整语法,主要调整参数:position,涉及的函数包括position_dodge()和position_jitterdodge()。其数据集的构造如下所示。

图3-3-21 箱形图和抖动散点图的位置调整

图3-3-21 箱形图和抖动散点图的位置调整(续)