第4章 用图层构建对象
目录
- 4.1 ggplot2简介
- 4.2 创建绘图对象
- 4.3 图层添加
- 4.4 数据
- 4.5 图形属性映射
- 4.6 几何对象
- 4.7 统计变换
- 4.8 位置调整
- 4.9 整合
4.1 简介
一个图层由5部分组成:
- 数据,必须是一个数据框(dataframe)
- 一组图形属性映射
- 集合对象,指定图层中用哪几种几何对象来绘图
- 统计变换, 对原始数据做一些有用的统计变换
- 位置调整, 通过调整元素位置来避免图形重合
4.2 创建绘图对象
ggplot()函数,有两个主要的参数:数据和图形属性映射,这两个参数是默认参数,只有在新添加的图层里设定了新参数时,默认值才会被修改。
参数数据指定绘图所用的数据框;参数映射的设定方法与qplot()非常相似,只需要将图形属性和变量名放到函数aes()的括号内即可。
下面给定一组默认映射:
library(ggplot2)
p <- ggplot(diamonds, aes(carat, price, colour = cut))
4.3 图层
如果给上述的图形对象添加一个点几何对象(point geom)就会得到一个散点图
p <- p + layer(geom = "point")
用“+”来添加图层
现有版本的layer图层参数为:
layer(geom = NULL, stat = NULL, data = NULL, mapping = NULL,
position = NULL, params = list(), inherit.aes = TRUE,
check.aes = TRUE, check.param = TRUE, subset = NULL, show.legend = NA)
下面的代码生成一个组距为2、铁青色的直方图(已经经过新版本改正)
p <- ggplot(diamonds, aes(x = carat))
p <- p + layer(
geom = "bar",
params = list(fill = "steelblue",binwidth = 2),
position = "identity",
stat = "bin"
)
p
对上面的版本使用快捷函数(short-cut)进行简化,下面的代码与上述效果相同
geom_histogram(binwidth = 2,fill = "steelblue")
所有的快捷函数都有相同的形式,以geom_或者stat_开头
geom_XXX(mapping, data, ..., stat, position)
geom_XXX(mapping, data, ..., geom, position)
他们的参数定义了图层的各种组件:
- mapping (可选):一组图形属性映射,通过aes()函数来设定
- data(可选):一个数据集,它会修改默认的数据集,如果该参数省略将调用默认数据集
- ...:geom或stat的参数,例如直方图的组距,或者loess光滑曲线的带宽。也可以用图形属性作为参数,这样该属性就被设定为一个固定值,而不是被映射给数据集中的一个变量
- geom或stat(可选):使用的几何对象或统计变换的名称
- position(可选):选择一种调整对象重合的方式
summary函数可以帮助我们查看图形对象的结构而不用直接绘制出图形
一组图形可以先用不同的数据来进行初始化,然后加上相同的图层,如下图所示:
library(scales)
bestfit <- geom_smooth(method = "lm", se = F, colour = alpha("steelblue",0.5), size = 2)
qplot( sleep_rem, sleep_total, data = msleep) + bestfit
qplot(awake, brainwt, data = msleep, log = "y") + bestfit
qplot(bodywt, brainwt, data = msleep, log = "xy") + bestfit
4.4 数据
ggplot2对数据集的要求很简单:必须是一个数据框(dataframe)
这种限制可以方便我们使用相同的代码、不同的数据集进行绘图——只需要改变数据集即可。如下图所示,使用%+%来添加新的数据集以替代原来的数据集
p <- ggplot(mtcars, aes(mpg, wt, colour = cyl)) +
geom_point()
p
mtcars <- transform(mtcars, mpg = mpg ^2)
p %+% mtcars
4.5 图形属性映射
aes()函数用来将数据变量映射到图形中,从而使变量成为可以被感知的图形属性。
aes(x = weight, y = height, colour = age)
也可以使用变量的函数值作为参数,如:
aes(x = weight, y = height, colour = sqrt(age))
4.5.1 图和图层
p <- ggplot(mtcars)
summary(p)
p <- p +aes(wt, hp)
summary(p)
例子:用默认的参数映射来添加图层的例子
p <- ggplot(mtcars, aes(x = mpg, y = wt))
p + geom_point()
例子:修改图层属性,扩充默认的映射(用factor(cyl)修改颜色,用disp修改y坐标)
p + geom_point(aes(colour = factor(cyl)))
p + geom_point(aes(y = disp))
4.5.2 设定和映射
- 例子1:用图层的colour参数设定点的颜色:是将点的颜色设定为了深蓝色
p <- ggplot(mtcars, aes(mpg,wt))
p + geom_point(colour = "darkblue")
- 例子2:将colour参数映射到“darkblue”颜色,实际是先创建了一个只含有“darkblue”字符的变量,然后将colour映射到这个新的变量上,又因为这个新变量的值是离散型的,所以默认的颜色标度将采用色轮上等间距的颜色,并且此处新变量只有一个值,因此这个颜色就是桃红色。
p + geom_point(aes(colour = "darkblue"))
在使用qplot函数时,我们是将某个值放在I()函数中来实现映射的,比如colour= I("darkblue")
4.5.3 分组
多个分组与单个图形属性
例子:时间序列图,每个男孩对应一条线(数据集来自于nlme包)
library(nlme)
p <- ggplot(Oxboys, aes(age, height, group = Subject)) +
geom_line()
p
在不同图层上的不同分组
例子:根据不同水平下的数据整合来对统计汇总信息进行图形绘制,此时的分组方式不该采用绘制折线图的方式
p +geom_smooth(aes(group = 1), method = "lm", size = 2, se = F)
修改默认分组
例子:绘制各个时期身高的箱线图,无需设置分组变量,默认的occasion是离散型的,默认为分组变量了。但是如果添加个体轨迹,就需要修改默认的分组变量了
boysbox <- ggplot(Oxboys, aes(Occasion, height)) +
geom_boxplot()
boysbox
boysbox + geom_line(aes(group = Subject), colour = "#3366FF")
4.5.4 匹配图形属性和图形对象
R不能绘制不同类型相连接的线条。
对于线条和路径,线段的图形属性是由起始点的图形属性决定的。所以当想要渐变的线条类型,就需要用线性插值法来做,见如下代码:
----------------------not successful--------------------------
xgrid <- with(df, seq(min(x), max(x), length = 50) )
interp <- data.frame(
x = xgrid,
y = approx(dfy, xout = xgrid)x, dfy
)
qplot(x, y, data = df, colour = colour, size = I(5)) +
geom_line(data = interp, size = 2)
*a little error going on here *
4.6 几何对象
几何图形对象,简称为geom,它执行着图层的实际渲染,控制着生成的图像类型。
每个几何对象都有一组它能识别的图形属性和一组绘图所需的值。
每一个几何对象都有一个默认的统计变换,并且每一个统计变换都有一个默认的几何对象。修改默认值可能会违反一些绘图惯例。
ggplot2中的几何对象
!(ggplot2中的几何对象)[http://ww4.sinaimg.cn/large/0060lm7Tgy1fe2s6m6t67j309z0lbtah.jpg]
!(默认的统计变换和图形属性)[http://ww1.sinaimg.cn/large/0060lm7Tgy1fe2s9nt7ecj30gb0lmwgs.jpg]
4.7 统计变换
统计变换,简称为stat,即对数据进行统计变换,它通常以某种方式对数据信息进行汇总。
!(ggplot2中的统计变换)[http://ww4.sinaimg.cn/large/0060lm7Tgy1fe2seil9a3j30em0etdhi.jpg]
统计变换中的生成变量(generated variable)可以直接被调用,但是调用的时候生成变量的名字必须要用..围起来,这样可以防止原数据集中的变量和生成变量重名时造成混淆,并且后期可以轻易分辨哪些变量是由统计变换生成的。
qplot(carat, ..density.., data = diamonds, geom = "histogram", binwidth = 0.1 )
4.8 位置调整
所谓位置调整,即对该图层中的元素位置进行微调。
五种位置调整参数:dodge(避免重复,并排放置),fill(堆叠图形元素并将高度标准化为1),identity(不做任何调整),jitter(给点添加扰动避免重合),stack(将元素堆叠出来)
4.9 整合
4.9.1 结合几何对象和统计变换
例子:基于直方图的统计变换,几何对象展示方式采用:面积、点和瓦块
d <- ggplot(diamonds, aes(carat)) + xlim(0,3)
d + stat_bin(aes(ymax = ..count..), binwidth = 0.1, geom = "area")
d + stat_bin(aes(size = ..density..), binwidth = 0.1, geom = "point", position = "identity")
d + stat_bin(aes(fill = ..count..), binwidth = 0.1, geom = "tile", position = "identity")
有些几何对象是基于其他几何对象衍生而来的,只是修改有些几何对象的默认图形属性或统计变换。
4.9.2 显示已计算过的统计量
stat_identity()可以直接将某些已统计好的数据进行映射而不进行其他的统计变换。
4.9.3 改变图形属性和数据集
结合模型的输出结果和原始数据
require(nlme,quietly = TRUE, warn.conflicts = FALSE)
model <- lme(height ~ age, data = Oxboys, random = ~ 1+ age | Subject)
oplot <- ggplot(Oxboys, aes(age, height, group = Subject)) +
geom_line()
oplot
把模型的预测结果添加到现有的数据中,下列代码获取模型的预测值
age_grid <- seq(-1, 1, length = 10)
subjects <- unique(Oxboys$Subject)
preds <- expand.grid(age = age_grid, Subject = subjects)
preds$height <- predict(model, preds)
绘制在同一张图上
oplot + geom_line(data = preds, colour = "#3366FF", size = 0.4)
另一种比较模型拟合好坏的方法是比较残差,使用到了更新数据集(%+%)将默认的y图形属性改为resid
Oxboys$fitted <- predict(model)
Oxboys$resid <- with(Oxboys, fitted - height)
oplot %+% Oxboys + aes(y = resid) +
geom_smooth(aes(group = 1))
模型的残差并不是随机分布的,因此所建立的模型有缺陷。继续向模型中添加一个二次项,再次计算拟合值和残差并绘图
model2 <- update(model, height ~ age + I(age ^2))
Oxboys$fitted2 <- predict(model2)
Oxboys$resid2 <- with(Oxboys, fitted2 - height)
oplot %+% Oxboys + aes(y = resid2) + geom_smooth(aes(group = 1))
最后一块模型预测和绘图还是有很多可以挖掘的地方,以后再深入学习。