16.3 ggplot2包

ggplot2包提供了一个基于全面而连贯的语法的绘图系统。它弥补了R中创建图形缺乏一致性的缺点,使得用户可以创建有创新性的、新颖的图形类型。

ggplot2中最简单的绘图方式是利用qplot()函数,即快速绘图函数。格式为:

  1. qplot(x, y, data=, color=, shape=, size=, alpha=, geom=, method=, formula=,
  2. facets=, xlim=, ylim=, xlab=, ylab=, main=, sub=)

表16-4列出了上述参数/选项的定义。 表16-4 qplot选项

选  项 描  述
alpha 元素重叠的alpha透明度,数值为0(完全透明)到1(完全不透明)间的分数
colorshapesizefill 把变量的水平与符号颜色、形状或大小联系起来。对于直线图,colo将把线条颜色与变量水平联系起来,对于密度图和箱线图, fill将把填充颜色与变量联系起来。图例将会被自动绘制
data 指定一个数据框
facets 指定条件变量,创建一个栅栏图。表达式如rowvar ~ colvar(示例见图16-10)。为创建一个基于单条件变量的栅栏图,可用rowvar ~ .. ~ colvar
geom 设定定义图形类型的几何形状。geom选项是一个单条目或多条目的字符型向量,包括"point""smooth""boxplot""line""histogram""density""bar""jitter"
mainsub 字符向量,设定标题和副标题
methodformula geom = "smooth",则会默认添加一条平滑拟合曲线和置信区间。 当观测数大于1000时,便需要调用更高效的平滑拟合算法。方法包括回归lm、广义可加模型gam、稳健回归rlmformula参数指定拟合的形式 例如,要添加简单的回归曲线,则设定geom = "smooth", method = "lm", formula = y ~ x。将表达式改为y ~ poly(x, 2)将生成二次拟合。注意表达式使用的是字母xy,而不是变量的名称 对于method = "gam",一定要记得加载mgcv包。对于method = "rml",则需加载MASS
xy 指定摆放在水平轴和竖直轴的变量。对于单变量图形(如直方图),则省略y
xlabylab 字符向量,设定横轴和纵轴标签
xlimylim 二元素数值型向量,分别指定横轴和纵轴的最小值和最大值

下面通过一些例子来看看qplot()的工作原理。如下代码创建了一个以气缸数为条件的每加仑英里数的箱线图。真实数据点都相互叠加(添加扰动以减少重叠),箱线图的颜色依据气缸数而变化。

  1. library(ggplot2)
  2. mtcars$cylinder <- as.factor(mtcars$cyl)
  3. qplot(cylinder, mpg, data=mtcars, geom=c("boxplot", "jitter"),
  4. fill=cylinder,
  5. main="Box plots with superimposed data points",
  6. xlab= "Number of Cylinders",
  7. ylab="Miles per Gallon")

图形结果见图16-8。

16.3 ggplot2包 - 图1

图16-8 以气缸数为条件的汽车英里数箱线图。数据点是重叠的,因此添加了扰动

第二个例子,我们来创建一个以车重为条件的每加仑英里数的散点图矩阵,利用颜色和符号形状区分自动挡和手动挡汽车。另外,我们还将对每种传动类型添加各自的回归线和置信区间带。

  1. library(ggplot2)
  2. transmission <- factor(mtcars$am, levels=c(0, 1),
  3. labels=c("Automatic", "Manual"))
  4. qplot(wt,mpg, data=mtcars,
  5. color=transmission, shape=transmission,
  6. geom=c("point", "smooth"),
  7. method="lm", formula=y~x,
  8. xlab="Weight", ylab="Miles Per Gallon",
  9. main="Regression Example")

图形结果见图16-9。这种类型的图形非常实用,但用其他软件包却并不容易做出这样的图。

16.3 ggplot2包 - 图2

图16-9 汽车英里数和车重间的散点图,依据发动机的传动类型(手动挡,自动挡)分别添加了回归线和置信区间带

第三个例子,我们将创建一个分面(栅栏)图。每个分面(面板)展示了车重与每加仑英里数的散点图。传动类型定义了行分面,而气缸数则定义了列分面。数据点的大小代表了汽车马力的评分。

  1. library(ggplot2)
  2. mtcars$cyl <- factor(mtcars$cyl, levels=c(4, 6, 8),
  3. labels=c("4 cylinders", "6 cylinders", "8 cylinders"))
  4. mtcars$am <- factor(mtcars$am, levels=c(0, 1),
  5. labels=c("Automatic", "Manual"))
  6. qplot(wt,mpg, data=mtcars, facets=am~cyl, size=hp)

图形结果见图16-10。可以看到利用ggplot2创建复杂的图形(实际上是一个气泡图)是多么容易。你还可以尝试对函数添加形状和颜色选项,来看看图形结果有何变化。

16.3 ggplot2包 - 图3

图16-10 车重和汽车英里数的散点图,依据传动类型(手动挡、自动挡)和气缸数(4、6和8)进行分面。符号大小表示马力值

在本节最后,我们再次对本章开始处的singer数据进行绘图。代码如下,图形结果见图16-11。

  1. library(ggplot2)
  2. data(singer, package="lattice")
  3. qplot(height, data=singer, geom=c("density"),
  4. facets=voice.part~., fill=voice.part)

16.3 ggplot2包 - 图4

图16-11 依据声部分面的歌手身高密度图

以这种方式来比较身高分布比用图16-1所示的方式更为容易。(当然,如果是彩色的,效果会更好。)

到目前为止,其实我们仅仅了解了这个强大绘图系统的一点皮毛。对它感兴趣的读者可以参考Wickham (2009)和ggplot2网站(http://had.co.nz/ggplot2/),其中有更详细的介绍。本章最后将介绍一些交互式图形以及相关的R函数。