16.3 ggplot2包
ggplot2
包提供了一个基于全面而连贯的语法的绘图系统。它弥补了R中创建图形缺乏一致性的缺点,使得用户可以创建有创新性的、新颖的图形类型。
ggplot2
中最简单的绘图方式是利用qplot()
函数,即快速绘图函数。格式为:
- qplot(x, y, data=, color=, shape=, size=, alpha=, geom=, method=, formula=,
- facets=, xlim=, ylim=, xlab=, ylab=, main=, sub=)
表16-4列出了上述参数/选项的定义。
表16-4 qplot
选项
选 项 | 描 述 |
---|---|
alpha | 元素重叠的alpha透明度,数值为0(完全透明)到1(完全不透明)间的分数 |
color 、shape 、size 、fill | 把变量的水平与符号颜色、形状或大小联系起来。对于直线图,colo 将把线条颜色与变量水平联系起来,对于密度图和箱线图, fill 将把填充颜色与变量联系起来。图例将会被自动绘制 |
data | 指定一个数据框 |
facets | 指定条件变量,创建一个栅栏图。表达式如rowvar ~ colvar (示例见图16-10)。为创建一个基于单条件变量的栅栏图,可用rowvar ~ . 或. ~ colvar |
geom | 设定定义图形类型的几何形状。geom 选项是一个单条目或多条目的字符型向量,包括"point" 、"smooth" 、"boxplot" 、"line" 、"histogram" 、"density" 、"bar" 和"jitter" |
main 、sub | 字符向量,设定标题和副标题 |
method 、formula | 若geom = "smooth" ,则会默认添加一条平滑拟合曲线和置信区间。 当观测数大于1000时,便需要调用更高效的平滑拟合算法。方法包括回归lm 、广义可加模型gam 、稳健回归rlm 。formula 参数指定拟合的形式
例如,要添加简单的回归曲线,则设定geom = "smooth", method = "lm", formula = y ~ x 。将表达式改为y ~ poly(x, 2) 将生成二次拟合。注意表达式使用的是字母x 和y ,而不是变量的名称
对于method = "gam" ,一定要记得加载mgcv 包。对于method = "rml" ,则需加载MASS 包 |
x 、y | 指定摆放在水平轴和竖直轴的变量。对于单变量图形(如直方图),则省略y |
xlab 、ylab | 字符向量,设定横轴和纵轴标签 |
xlim 、ylim | 二元素数值型向量,分别指定横轴和纵轴的最小值和最大值 |
下面通过一些例子来看看qplot()
的工作原理。如下代码创建了一个以气缸数为条件的每加仑英里数的箱线图。真实数据点都相互叠加(添加扰动以减少重叠),箱线图的颜色依据气缸数而变化。
library(ggplot2)
mtcars$cylinder <- as.factor(mtcars$cyl)
qplot(cylinder, mpg, data=mtcars, geom=c("boxplot", "jitter"),
fill=cylinder,
main="Box plots with superimposed data points",
xlab= "Number of Cylinders",
ylab="Miles per Gallon")
图形结果见图16-8。
图16-8 以气缸数为条件的汽车英里数箱线图。数据点是重叠的,因此添加了扰动
第二个例子,我们来创建一个以车重为条件的每加仑英里数的散点图矩阵,利用颜色和符号形状区分自动挡和手动挡汽车。另外,我们还将对每种传动类型添加各自的回归线和置信区间带。
library(ggplot2)
transmission <- factor(mtcars$am, levels=c(0, 1),
labels=c("Automatic", "Manual"))
qplot(wt,mpg, data=mtcars,
color=transmission, shape=transmission,
geom=c("point", "smooth"),
method="lm", formula=y~x,
xlab="Weight", ylab="Miles Per Gallon",
main="Regression Example")
图形结果见图16-9。这种类型的图形非常实用,但用其他软件包却并不容易做出这样的图。
图16-9 汽车英里数和车重间的散点图,依据发动机的传动类型(手动挡,自动挡)分别添加了回归线和置信区间带
第三个例子,我们将创建一个分面(栅栏)图。每个分面(面板)展示了车重与每加仑英里数的散点图。传动类型定义了行分面,而气缸数则定义了列分面。数据点的大小代表了汽车马力的评分。
library(ggplot2)
mtcars$cyl <- factor(mtcars$cyl, levels=c(4, 6, 8),
labels=c("4 cylinders", "6 cylinders", "8 cylinders"))
mtcars$am <- factor(mtcars$am, levels=c(0, 1),
labels=c("Automatic", "Manual"))
qplot(wt,mpg, data=mtcars, facets=am~cyl, size=hp)
图形结果见图16-10。可以看到利用ggplot2
创建复杂的图形(实际上是一个气泡图)是多么容易。你还可以尝试对函数添加形状和颜色选项,来看看图形结果有何变化。
图16-10 车重和汽车英里数的散点图,依据传动类型(手动挡、自动挡)和气缸数(4、6和8)进行分面。符号大小表示马力值
在本节最后,我们再次对本章开始处的singer
数据进行绘图。代码如下,图形结果见图16-11。
library(ggplot2)
data(singer, package="lattice")
qplot(height, data=singer, geom=c("density"),
facets=voice.part~., fill=voice.part)
图16-11 依据声部分面的歌手身高密度图
以这种方式来比较身高分布比用图16-1所示的方式更为容易。(当然,如果是彩色的,效果会更好。)
到目前为止,其实我们仅仅了解了这个强大绘图系统的一点皮毛。对它感兴趣的读者可以参考Wickham (2009)和ggplot2网站(http://had.co.nz/ggplot2/),其中有更详细的介绍。本章最后将介绍一些交互式图形以及相关的R函数。