ggplot2(3) 语法突破 3.1 简介 3.2 耗油量数据 3.3 绘制散点图 3.4 更复杂的图形示例 3.5 图层语法的组件 3.6 数据结构 总结

 图形图层语法基于Wilkinson的图形语法,并在其基础上添加了许多新功能,使得图形更有表现力,并能完美地嵌入到R的环境中。

图形图层语法使得图形的重复更新变得简单——每次只更新一个特征。该语法的价值还在于它从更高的视角审视了图形的构成,它认为图形的每个组件都是可以修改的。因此,这就给了我们一个作图的基本结构框架,使得图形的绘制更为容易。对于特殊的问题,我们还可以利用它很方便地定义新图形。

3.2 耗油量数据

> head(mpg)
# A tibble: 6 x 11
  manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class  
  <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>  
1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compact
2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compact
3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compact
4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compact
5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compact
6 audi         a4      2.8  1999     6 manual(m5) f        18    26 p     compact

该数据集包含美国环保署提供的燃油经济性数据集。它包含1999年至2008年间发布的车型。

  • manufacturer,model:型号名称
  • displ:发动机排量,升
  • year:制造年份
  • cyl:气缸数
  • trans:传动类型
  • drv:f =前轮驱动,r =后轮驱动,4 =四轮驱动
  • cty:每加仑城市行驶英里数
  • hwy:每加仑公路里程
  • fl:燃油类型
  • class:车辆类型

3.3 绘制散点图

qplot(displ, hwy, data = mpg, colour = factor(cyl))

ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结

通过发动机排量(以升为单位 displ)对高速公路耗油量(英里每加仑hwy)根据汽缸数目着色的散点图。可以发现影响燃油经济性最重要的因素:发动机排量大小。

图形属性和数据的映射

每个点不仅有横坐标和纵坐标,还有大小、颜色和形状,这些属性我们称之为图形属性。每个图形属性都可以映射为一个变量或者设定为一个常数。上图中displ控制点的水平位置,hwy控制点的竖直位置,cyl控制点的颜色,而点的形状和大小都没有指定映射的变量,使用的是默认值(常数)。

点、线和条都是几何对象的具体表现形式,决定了图形的类型,只含一种几何对象的图通常有特定的名字:

散点图——点,气泡图——点,条形图——条形,箱线图——箱子,折线图——线。

标度变换

把数据单位(升、英里加仑数和气缸数)转换成电脑可以识别的物理单位(如像素和颜色),这个过程称为标度转换。

颜色的标度变换就是将数据的值映射到三维的颜色空间中,当变量是离散型时,默认将它的值等距的 映射到色轮上。

3.4 更复杂的图形示例

qplot(displ, hwy, data = mpg, facets = . ~ year) + geom_smooth()

ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结

分面板形成了一个二维网格,图层在第三维方向上叠加。

平滑曲线层和散点层的不同之处在于它没有展现原始数据,而是展示了统计变换后的数据。平滑曲线层拟合了一条穿过数据中间位置的平滑曲线。添加该图层需要将数据映射到图形属性后,对其进行统计变换。在上图中,统计变换首先用一条loess平滑曲线来拟合数据,然后再数据的范围内,利用等间隔的点,计算并返回点所对应的预测值。其他有用的统计变换包括一维和二维的封箱、求组平均、分位数回归和等高线。

ggplot2的绘图过程:将变量映射到图形属性→对数据进行分面处理→标度变换→计算图形属性→标度训练→标度映射→渲染几何对象。

3.5 图层语法的组件

图层语法所定义的图由以下几部分组成:

  1. 一个默认的数据集和一组从变量到图形属性的映射;
  2. 一个或多个图层,每个都由一种几何对象、一种统计变换和一种位置调整组成;
  3. 标度,每个图形属性映射都对应一个标度;
  4. 一个坐标系统;
  5. 分面设定。

3.5.1 图层

图层的作用是生成在图像上可以被人感知的对象。一个图层由4部分组成:

  1. 数据和图形属性映射;
  2. 一种统计变换;
  3. 一种及几何对象;
  4. 一种位置调整方式。

3.5.2 标度

标度控制数据到图形的映射,并且图形上所用的每一个图形属性都对应着一个标度。每个标度都作用于图形中的所有数据,以确保从数据到图形属性映射的一致性。

一个标度就是一个含有一组参数的函数,它的逆也是如此。例如颜色梯度,把一条实线的各部分映射成一条含不同颜色的路径,函数中的参数可以规定该路径是直线还是曲线,决定选择哪种颜色空间(LUV还是RGB),起始和终止位置的颜色。

其逆函数被用来绘制参照对象,通过参照对象才能读出图里隐含的信息。参照对象可以是坐标轴或者是图例。大多数的映射都由唯一的逆函数(一一映射),但有些不是。逆映射的唯一性使得复原数据成为可能,但当我们只关注某个方面时,我们不是很在意它是不是唯一映射。

ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结

从左到右:连续型变量映射到大小和颜色,离散型变量映射到形状和颜色。

3.5.3 坐标系

坐标系可将对象的位置映射到图形平面上,笛卡尔坐标系是最常用的二维坐标系,极坐标系和各种地图投影则用得相对少一些。

3.5.4 分面

分面是条件绘图和网络绘图的一般形式,通过它可以方便地展示数据的不同子集。特别是当验证在不同条件下模型是否保持一致时,分面绘图是一个强大的工具。

3.6 数据结构

ggplot2的图形语法通过一种非常简单直接的方式编码到R的数据结构中。一个图形对象就是一个包含数据、映射、图层、标度、坐标和分面的列表,图形对象中还有一个目前我们还未讨论的组件:options。

当我们得到一个图形对象时,可以对他进行如下处理:

  • 用print()函数将其呈现到屏幕上。在交互式操作时print()会自动地被调用,但是在循环或函数里,我们需要手动输入print();
  • 用ggsave()函数将其保存到磁盘;
  • 用summary()查看它的结构;
  • 用save()函数将它的缓存副本保存到磁盘,这样可以保存一个图形对象的完整副本,使用load()函数可以重现该图。

例如:

p <- qplot(displ, hwy, data = mpg, colour = factor(cyl))
print(p)
summary(p)
# 保存图形对象
save(p, file = "plot.rdata")
# 读入图形对象
load("plot.rdata")
# 将图片保存成png格式
ggsave("plot.png", width = 5, height = 5) 

data: manufacturer, model, displ, year, cyl, trans, drv, cty,
hwy, fl, class [234x11]
mapping: x = ~displ, y = ~hwy, colour = ~factor(cyl)
faceting: <ggproto object: Class FacetNull, Facet, gg>
compute_layout: function
draw_back: function
draw_front: function
draw_labels: function
draw_panels: function
finish_data: function
init_scales: function
map_data: function
params: list
setup_data: function
setup_params: function
shrink: TRUE
train_scales: function
vars: function
super: <ggproto object: Class FacetNull, Facet, gg>
-----------------------------------
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity

总结

ggplot2(3) 语法突破
3.1 简介
3.2 耗油量数据
3.3 绘制散点图
3.4 更复杂的图形示例
3.5 图层语法的组件
3.6 数据结构
总结