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

1.6.1 geom_xxx()与stat_xxx()

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

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

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

根据函数输入的变量总数与数据类型(连续型或离散型),我们可以将大部分函数大致分成3个大类,6个小类,如表1-6-1所示,但是有两类函数没有囊括在此表中。

表1-6-1 ggplot2函数的分类

(1)图元(graphical primitive)系列函数: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()可以分别绘制误差框、竖直误差线、水平误差线、带误差棒的均值点。但是,这些函数需要先设置统计变换参数,才能自动根据数据计算得到均值与标准差,再使用其绘制误差信息。

每个ggplot2函数的具体参数信息可以查看RStudio的“help”界面或者ggplot2的官方手册ggplot2的官方手册:https://ggplot2.tidyverse.org/reference/index.html

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

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

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

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

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

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

       (a1)ggplot(mydata, aes(Class, Value, fill = Class))+
                stat_summary(fun.y="mean", fun.args = list(mult=1), geom="point", color = "white", size = 4)
       (b1)ggplot(mydata, aes(Class, Value, fill = Class))+
        geom_point(stat="summary", fun.y="mean", fun.args = list(mult=1), color = "white", size = 4)

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

       (a2)ggplot(mydata, aes(Class, Value, fill = Class))+
              stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), geom="pointrange", color = "black", size = 1.2)
       (b2)ggplot(mydata, aes(Class, Value, fill = Class))+
        geom_pointrange(stat="summary", fun.data="mean_sdl", fun.args = list(mult=1), color = "black", size = 1.2)

其中,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_×××()以强调数据的统计变换。