R语言ggplot2:第四章 用图层构建对象

第4章 用图层构建对象

目录

  • 4.1 ggplot2简介
  • 4.2 创建绘图对象
  • 4.3 图层添加
  • 4.4 数据
  • 4.5 图形属性映射
  • 4.6 几何对象
  • 4.7 统计变换
  • 4.8 位置调整
  • 4.9 整合

4.1 简介

一个图层由5部分组成:

  1. 数据,必须是一个数据框(dataframe)
  2. 一组图形属性映射
  3. 集合对象,指定图层中用哪几种几何对象来绘图
  4. 统计变换, 对原始数据做一些有用的统计变换
  5. 位置调整, 通过调整元素位置来避免图形重合

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
image.png

对上面的版本使用快捷函数(short-cut)进行简化,下面的代码与上述效果相同

geom_histogram(binwidth = 2,fill = "steelblue")

所有的快捷函数都有相同的形式,以geom_或者stat_开头

geom_XXX(mapping, data, ..., stat, position)
geom_XXX(mapping, data, ..., geom, position)

他们的参数定义了图层的各种组件:

  1. mapping (可选):一组图形属性映射,通过aes()函数来设定
  2. data(可选):一个数据集,它会修改默认的数据集,如果该参数省略将调用默认数据集
  3. ...:geom或stat的参数,例如直方图的组距,或者loess光滑曲线的带宽。也可以用图形属性作为参数,这样该属性就被设定为一个固定值,而不是被映射给数据集中的一个变量
  4. geom或stat(可选):使用的几何对象或统计变换的名称
  5. 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
image.png
qplot(awake, brainwt, data = msleep, log = "y") + bestfit
image.png
qplot(bodywt, brainwt, data = msleep, log = "xy") + bestfit
image.png

4.4 数据

ggplot2对数据集的要求很简单:必须是一个数据框(dataframe)

这种限制可以方便我们使用相同的代码、不同的数据集进行绘图——只需要改变数据集即可。如下图所示,使用%+%来添加新的数据集以替代原来的数据集

p <- ggplot(mtcars, aes(mpg, wt, colour = cyl)) +
  geom_point()
p
image.png
mtcars <- transform(mtcars, mpg = mpg ^2)
p %+% mtcars
image.png

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()
image.png

例子:修改图层属性,扩充默认的映射(用factor(cyl)修改颜色,用disp修改y坐标)

p + geom_point(aes(colour = factor(cyl)))
image.png
p + geom_point(aes(y = disp))
image.png

4.5.2 设定和映射

  1. 例子1:用图层的colour参数设定点的颜色:是将点的颜色设定为了深蓝色
p <- ggplot(mtcars, aes(mpg,wt))
p + geom_point(colour = "darkblue")
image.png
  1. 例子2:将colour参数映射到“darkblue”颜色,实际是先创建了一个只含有“darkblue”字符的变量,然后将colour映射到这个新的变量上,又因为这个新变量的值是离散型的,所以默认的颜色标度将采用色轮上等间距的颜色,并且此处新变量只有一个值,因此这个颜色就是桃红色。
p + geom_point(aes(colour = "darkblue"))
image.png

在使用qplot函数时,我们是将某个值放在I()函数中来实现映射的,比如colour= I("darkblue")

4.5.3 分组

多个分组与单个图形属性

例子:时间序列图,每个男孩对应一条线(数据集来自于nlme包)

library(nlme)
p <- ggplot(Oxboys, aes(age, height, group = Subject)) +
  geom_line()
p
image.png

在不同图层上的不同分组

例子:根据不同水平下的数据整合来对统计汇总信息进行图形绘制,此时的分组方式不该采用绘制折线图的方式

p +geom_smooth(aes(group = 1), method = "lm", size = 2, se = F)
image.png

修改默认分组

例子:绘制各个时期身高的箱线图,无需设置分组变量,默认的occasion是离散型的,默认为分组变量了。但是如果添加个体轨迹,就需要修改默认的分组变量了

boysbox <- ggplot(Oxboys, aes(Occasion, height)) +
  geom_boxplot()
boysbox
image.png
boysbox + geom_line(aes(group = Subject), colour = "#3366FF")
image.png

4.5.4 匹配图形属性和图形对象

R不能绘制不同类型相连接的线条。

对于线条和路径,线段的图形属性是由起始点的图形属性决定的。所以当想要渐变的线条类型,就需要用线性插值法来做,见如下代码:

----------------------not successful--------------------------
xgrid <- with(df, seq(min(x), max(x), length = 50) )
interp <- data.frame(
x = xgrid,
y = approx(dfx, dfy, xout = xgrid)y, colour = approx(dfx, dfcolour, xout = xgrid)y
)
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 )
image.png

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")
image.png
d + stat_bin(aes(size = ..density..), binwidth = 0.1, geom = "point", position = "identity")
image.png
d + stat_bin(aes(fill = ..count..), binwidth = 0.1, geom = "tile", position = "identity")
image.png

有些几何对象是基于其他几何对象衍生而来的,只是修改有些几何对象的默认图形属性或统计变换。

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
image.png

把模型的预测结果添加到现有的数据中,下列代码获取模型的预测值

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)
image.png

另一种比较模型拟合好坏的方法是比较残差,使用到了更新数据集(%+%)将默认的y图形属性改为resid

Oxboys$fitted <- predict(model)
Oxboys$resid <- with(Oxboys, fitted - height)

oplot %+% Oxboys + aes(y = resid) +
  geom_smooth(aes(group = 1))
image.png

模型的残差并不是随机分布的,因此所建立的模型有缺陷。继续向模型中添加一个二次项,再次计算拟合值和残差并绘图

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))
image.png

最后一块模型预测和绘图还是有很多可以挖掘的地方,以后再深入学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容