第三章 语法突破
本章代码
本章讲了一些原理性的东西,看不懂也没关系,不影响使用。只挑了关键的内容摘抄。
3.1简介
本章介绍更多关于ggplot2更多的语法。
主要介绍ggplot2的理论基础:图形图层语法。
本章首先详述了绘制简单图形的过程。然后,3.3 节介绍了简单散点图的绘制方法,3.4节在此基础上又添加了光滑曲线和分面。在学习这些例子的同时,六种语法组件也会被先后提及。随后3.5节对它们作了更为精确的定义。最后,本章以3.6节作结,介绍了怎样将这些图形组件映射成R的数据结构。
3.2 油耗量数据
ggplot2里的mpg
数据集,记录了车辆的厂商、型号、类别、引擎大小、传动系统和耗油量等信息。
该数据集隐含了许多有趣的问题。引擎大小和耗油量有什么关系?是不是某些制造商比其他的制造商更关注汽车的耗油量?耗油量在过去的十年中有没有明显的增加?我们将尝试回答第-一个问题, 并在此过程中学习更多关于绘制
散点图的细节。
3.3 绘制散点图
观察图3.1,它是对上面问题的一一个简单回答。这是-一个含有两个连续型变量的散点图(发动机排量(engine displacement)和高速公路每加仑行驶的英里数(highway mpg)),图中点的颜色是由第三个变量(汽缸(cylinders) 的数目)决定的。利用以前章节里学的知识,你应该知道如何使用qplot()来作这幅图。但.是这背后的具体原理是怎样的呢? ggplot2 是怎样作出这幅图的呢?qplot(displ, hwy, data = mpg, colour = factor(cy1))
library("ggplot2")
p <- qplot(displ, hwy, data = mpg, colour = factor(cyl))
ggsave(file = "test.png", plot = p, width = 4, height = 3)
3.3.1 图形属性与数据映射
图形属性包括size、color、shape、position、不透明度等等等,学过PS的肯定都了解。
数据映射就是将我们的数据映射到图层属性上去,如上例中,图形类型默认为point,大小也是默认值,变量displ映射到点的水平位置,变量hwy映射到点的竖直位置,变量cyl映射到点的颜色。由此就可以将我恩的数据可视化为一个图形。
3.3.2 标度变换
就是指值映射这一过程,将原始数据中的变量或常量转化为图形属性的过程。
3.4 更复杂的图形示例
下面的示例添加了三种新的组件:分面、多个图层和统计量。
p <- qplot(displ, hwy, data = mpg, facets = .~year)
p = p + geom_smooth()
ggsave(file = "test.png", plot = p, width = 8, height = 4)
有的变换在各个数据集里都是相同的。标度变换实际上出现在三个地方:标度转换(transforming), 标度训练(training) 和标度映射(mapping)。我们之前还没有提到过变换,但是你可能已经在双对数(log-log) 图中看到过了。在双对数图中,数据值不是线性映射到图形上的位置,而是先进行了对数变换。
- 标度转换先于统计变换,因此统计量都是基于标度变换后的数据计算的。
这样可以确保log(x)对log(y)在线性尺度上的图与x对y在对数尺度上
的图看起来- -样。另外,还有其他不同的变换可以使用,包括取平方根、
对数和倒数。详见6.4.2节; - 计算完统计量之后,所有分面和图层的数据集中的每个标度都会被“训
练”。标度训练将根据所有小数据集里数据的范围得到整体数据的范围。
如果没有这一步,标度将只具有局部意义,当将不同的层叠加到- -起时,
它们的位置就会错乱。不过有些时候我们也需要得到不同分面间(绝不是
图层间)标度有错位的图形,这种情况详见7.2.3 节; - 最后,标度映射将数据映射到图形属性中。这是-一个局部操作:每个数据
集里的变量都映射给相应的图形属性值,生成一个新的数据集后再用几何对象来渲染。
3.5 图层语法的组件
3.5.1图层
图层的作用是生成在图像上可以被人感知的对象。一个图层由4部分组成:
- 数据和图形属性映射;
- 一种统计变换;
- 一种几何对象;
- 一种位置调整方式。
图层的属性将在第4章介绍,而第5章则介绍应用它们进行数据可视化的方法。
3.5.2标度
标度控制数据到图形属性的映射,并且图形上所用的每一-个图形属性都对应着一个标度。每个标度都作用于图形中的所有数据,以确保从数据到图形属.性映射的一致性。一些标度如图3.8所示。
一个标度就是一个含有一组参数的函数,它的逆也是如此。例如颜色梯度标度,它把--条实线的各部分映射成--条含不同颜色的路径。函数中的参数可规定该路径是直线还是曲线,决定选择哪个颜色空间(例如,LUV还是RGB)、起始和终止位置的颜色。
其逆函数被用来绘制参照对象,通过参照对象你才能读出图里隐含的信息。参照对象可以是坐标轴(位置标度)或者是图例(其他标度)。大多数的映射都有唯一-的逆函数(也就是一-对一映射),但有些不是。逆映射的唯-性使得复原数据成为可能,但当我们只关注某个方面时,我们不会很在意它是不是一映射。
3.6 绘图方式
绘图有两种方式: 一种是“-一步到位”式,即利用前面学过的qplot();另一种是“逐层叠加”式,即利用ggplot()函数和图层函数逐步作图,细节请见第4章(实际运用多用此方法)。当我们得到一个图形对象时,可以对它进行如下处理:
- 用print()函数将其呈现到屏幕上。在交互式操作时print() 会自动被调用,但是在循环或函数里,我们需要手动输人print();
- 用ggsave()函数将其保存到磁盘,详见8.3节;
- 用summary()简单查看它的结构;
- 用save()函数把它的缓存副本保存到磁盘;这样可以保存-一个图形对象的完整副本,你可以调用load()函数来重现该图。注意数据是储存在图形对象里的,所以如果你在图形对象外修改数据,然后重新读人已保存的图形对象,图像将不会更新。
p <- qplot(displ, hwy, data = mpg, facets = .~year)
p <- p + geom_smooth()
# save to a "png" image
ggsave(file = "test.png", plot = p, width = 8, height = 4)
# print to interactive panel
print(p)
# save to a R data which can be load again
save(p, file = "test1.RData")
# load the saved R data
load("test1.RData")