R语言数据可视化 ggplot2基础1 ggplot2 图形的分层语法 Layered Grammar 简介

R语言数据可视化 ggplot2基础1 ggplot2 图形的分层语法 Layered Grammar 简介

ggplot2是tidyverse包的一部分,tidyverse是Hadley Wickham及其团队了为了能够系统性处理数据、图表开发的一个包。对我们统计人来说,尽管R语言提供了很多数据可视化的方法,但ggplot2依然是R语言做可视化的最优雅、最强大的包。gg的含义是grammar of graphics,这就暗示了ggplot2就是描述与建立图形的语言。这一讲我们介绍分层语法的主要内容,这些内容将帮助大家理解ggplot2的函数与命令。一些细节可以参考Hadley Wickham的文章A Layered Grammar of Graphics,这篇文章介绍了Hadley Wickham对图形对象的理解,Layered Grammar的组成与应用等内容。

Hadley Wickham认为一个plot需要有下面的一些组成部分:

  1. 图层(layer):数据集、一系列把数据集变成图形的映射(aesthetic mapping)、一个或一系列图形组成的几何对象(作为一个图层)、以及可能需要的统计变换(中心化、标准化等)、位置调整
  2. 面板(facet):一个facet由多个subplot构成,可以操作每个subplot的角度与位置
  3. 刻度(scale)
  4. 坐标系统(coordinates system)

下面我们逐个介绍这些内容。


分层语法的组成(data-stat-geom-scale-coord-facet)

数据(data)当然是画图的基础,但在分层语法中,数据与建立图形的命令是独立的,我们把代码看成是一个映射(mapping),数据就是映射的输入,图形是映射的输出,所以建立一种图形的命令应该适用于不同的数据集,按Hadley Wickham的原话来讲,就是Data are what turns an abstract graphic into a concrete graphic.

通常对输入的数据集,我们可以做一些统计变换(statistical transformation, 简称stat)来让图形“好看”一点,下面是ggplot2中常用的stat:
在这里插入图片描述
stat是一个映射,它把原始数据作为输入,然后用输出的数据作为创建图形的数据。实际上stat这一步就是我们所熟知的对原始数据做的统计处理。需要注意的是stat受刻度(scale)与坐标系统(coordinate system,简称coord)影响,比如平滑操作的话,在直角坐标系与极坐标系中平滑的效果肯定是不同的,即使都在直角坐标系中,不同坐标轴刻度下平滑的效果也是不同的。

几何对象(geometric object, 简称geom)是一个抽象的对象,比如区间是一个抽象对象,我们可以用不同的渲染(rendering)方法来表现它,比如下面四种都是区间的渲染方法:
在这里插入图片描述
一个geom只能展示特定的图形,比如散点图对象只能展示散点图,但我们可以通过参数调整散点的颜色、形状、大小、位置等属性;一个图层包含一个geom,如果要添加另一个几何对象,需要创建另一个图层进行操作。

最后是关于面板(facet)的,面板的作用是在一个plot中展示多个subplot,比如下面的图:
在这里插入图片描述
这是由 1 × 3 1 \times 3 1×3的subplot构成的一个facet,第一个subplot是直角坐标系,第二个是semi-log坐标,第二个是极坐标。

用分层语法理解一段ggplot2代码

我们来看一个简单的例子,来学习一下怎么用分层语法的框架(data-stat-geom-scale-coord-facet)去理解一段ggplot2的代码。

假设我们要创建下面这样的图形:

在这里插入图片描述
这是一个 1 × 2 1 \times 2 1×2的facet,左边的subplot是直角坐标系下钻石的价格与克拉的关系;右边的subplot是对数坐标系下钻石价格与克拉的关系。我们暂时不介绍facet操作,下面针对这两个subplot的ggplot2代码进行分析。我们回顾一下分层语法的组成:layer(data-stat-geom)-scale-coord-facet,就会发现ggplot2作图的代码与分层语法完全一致,也就是说ggplot2是严格按照分层语法设计的。ggplot()开头表示接下来要应用图形语法创建图形对象,第一步是创建图层,每一个图层包含数据、映射(aesthetic mapping)、几何对象、统计变换、位置调整;第二步是指定scale以及坐标系统。

Subplot 1

在这里插入图片描述
这是创建第一个图形所需要的ggplot2的代码。用ggplot()开头,然后用layer()创建图层,这个图层用的数据集是diamond;用aesthetic mapping是在指定变量,因为要画钻石价格随克拉变化的关系,所以 x x x轴是克拉, y y y轴是价格;几何对象是点,也就是要画散点图,没有指定其他参数,因此用的是默认样式;stat与位置用identity,也就是恒等变换,说明我们不需要对原始数据进行统计处理或者位置调整。接下来分别指定 x x x变量与 y y y变量的scale,continuous表示让刻度连续变化,不做其他的scaling;最后指定坐标系是直角坐标系。

Subplot 2

在这里插入图片描述
这是创建第二个图形所需要的ggplot2的代码。用ggplot()开头,然后用layer()创建两个图层。第一个图层的命令与subplot 1。第二个图层的数据与映射与第一个图层一样,但几何对象是smooth,表示我们希望第二个图层创造的几何对象是第一个图层的散点图的平滑曲线,stat也是smooth,后面的method = lm含义是我们用线性模型来smooth原始数据。重叠这两个图层,scale的时候把 x , y x,y x,y变量都取log,然后在直角坐标系下展示,我们就可以得到subplot 2。

综上,在了解了图形的分层语法后,我们可以很容易把图形与ggplot2的每一个命令联系起来。

猜你喜欢

转载自blog.csdn.net/weixin_44207974/article/details/112646491