ggplot2(3) 语法突破
3.1 简介
图形图层语法基于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))
通过发动机排量(以升为单位 displ)对高速公路耗油量(英里每加仑hwy)根据汽缸数目着色的散点图。可以发现影响燃油经济性最重要的因素:发动机排量大小。
图形属性和数据的映射
每个点不仅有横坐标和纵坐标,还有大小、颜色和形状,这些属性我们称之为图形属性。每个图形属性都可以映射为一个变量或者设定为一个常数。上图中displ控制点的水平位置,hwy控制点的竖直位置,cyl控制点的颜色,而点的形状和大小都没有指定映射的变量,使用的是默认值(常数)。
点、线和条都是几何对象的具体表现形式,决定了图形的类型,只含一种几何对象的图通常有特定的名字:
散点图——点,气泡图——点,条形图——条形,箱线图——箱子,折线图——线。
标度变换
把数据单位(升、英里加仑数和气缸数)转换成电脑可以识别的物理单位(如像素和颜色),这个过程称为标度转换。
颜色的标度变换就是将数据的值映射到三维的颜色空间中,当变量是离散型时,默认将它的值等距的 映射到色轮上。
3.4 更复杂的图形示例
qplot(displ, hwy, data = mpg, facets = . ~ year) + geom_smooth()
分面板形成了一个二维网格,图层在第三维方向上叠加。
平滑曲线层和散点层的不同之处在于它没有展现原始数据,而是展示了统计变换后的数据。平滑曲线层拟合了一条穿过数据中间位置的平滑曲线。添加该图层需要将数据映射到图形属性后,对其进行统计变换。在上图中,统计变换首先用一条loess平滑曲线来拟合数据,然后再数据的范围内,利用等间隔的点,计算并返回点所对应的预测值。其他有用的统计变换包括一维和二维的封箱、求组平均、分位数回归和等高线。
ggplot2的绘图过程:将变量映射到图形属性→对数据进行分面处理→标度变换→计算图形属性→标度训练→标度映射→渲染几何对象。
3.5 图层语法的组件
图层语法所定义的图由以下几部分组成:
- 一个默认的数据集和一组从变量到图形属性的映射;
- 一个或多个图层,每个都由一种几何对象、一种统计变换和一种位置调整组成;
- 标度,每个图形属性映射都对应一个标度;
- 一个坐标系统;
- 分面设定。
3.5.1 图层
图层的作用是生成在图像上可以被人感知的对象。一个图层由4部分组成:
- 数据和图形属性映射;
- 一种统计变换;
- 一种及几何对象;
- 一种位置调整方式。
3.5.2 标度
标度控制数据到图形的映射,并且图形上所用的每一个图形属性都对应着一个标度。每个标度都作用于图形中的所有数据,以确保从数据到图形属性映射的一致性。
一个标度就是一个含有一组参数的函数,它的逆也是如此。例如颜色梯度,把一条实线的各部分映射成一条含不同颜色的路径,函数中的参数可以规定该路径是直线还是曲线,决定选择哪种颜色空间(LUV还是RGB),起始和终止位置的颜色。
其逆函数被用来绘制参照对象,通过参照对象才能读出图里隐含的信息。参照对象可以是坐标轴或者是图例。大多数的映射都由唯一的逆函数(一一映射),但有些不是。逆映射的唯一性使得复原数据成为可能,但当我们只关注某个方面时,我们不是很在意它是不是唯一映射。
从左到右:连续型变量映射到大小和颜色,离散型变量映射到形状和颜色。
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
总结