ggplot2:数据分析与图形艺术 学习笔记04---第四章 用图层构建图像

浏览: 1951

4.1 简介

qplot() 的局限性在于它只能使用一个数据集和一组图形属性映射,解决这个问题的办法就是使用图层

每个图层可以有自己的数据集和图形属性映射,附加的数据元素可通过图层添加到图形中


# 一个图层由五个部分组成:

# 数据,必须是一个数据框(data frame) 详见4.4

# 一组图形属性映射,设定数据集中的变量如何映射到该图层的图形属性,详见4.5

# 几何对象,用来指定在图层中用那种几何对象来绘图,详见4.6

# 统计变换,对原数据做一些有用的统计变换,详见4.7

# 位置调整,通过调整元素位置来避免图形重合,详见4.8



4.2 创建绘图对象


ggplot() 函数有两个主要的参数:数据和图形属性映射

准备数据集

library(ggplot2)
dsmall <- diamonds[sample(nrow(diamonds),1000),]
str(dsmall)
dim(dsmall)
head(dsmall)
  carat     cut color clarity depth table price     x     y     z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.91 Ideal G SI2 61.6 56 3985 6.24 6.22 3.84
2 0.43 Premium D SI1 60.1 58 830 4.89 4.93 2.95
3 0.32 Ideal D VS2 61.5 55 808 4.43 4.45 2.73
4 0.33 Ideal G SI2 61.7 55 463 4.46 4.48 2.76
5 0.70 Good H SI1 64.2 58 1771 5.59 5.62 3.60
6 0.33 Ideal G VVS1 61.8 55 868 4.42 4.45 2.74

下面的例子设定了一组默认映射,x=carat,y=price,colour=cut

p <- ggplot(dsmall,aes(carat,price,colour = cut))

# 这个图形对象在加上图层之前无法显示,因此现在什么也看不见


4.3 图层

使用 “+”添加图层

快捷函数,设定stat或geom参数即可

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

stat_XXX(mapping,data,...,geom,position)


# mapping(可选) 一组图形属性映射,通过aes() 函数设定

# data(可选) 一个数据集,会修改默认的数据集,大部分情况下该参数被省略掉,默认数据集被调用

# ... geom 或 stat 的参数,例如直方图的组距(binwidth) 或者loess光滑曲线的带宽(bandwidth)

# geom 或 stat(可选) 可以修改geom默认的stat值,或者stat所默认的geom值。

# position(可选) 选择一种调整对象重合的方式

p <- p + geom_point()
p

Clipboard Image.png

注意,参数data和mapping在ggplot()函数和图层函数中的位置是相反的。

因为,在图形对象中一般先设定数据集,而在图层函数中大多是设定图形属性而不是数据集


# 下面的例子展示了两种绘图方法的等价性

ggplot(msleep,aes(sleep_rem/sleep_total,awake)) + geom_point()
qplot(sleep_rem/sleep_total,awake,data = msleep)

Clipboard Image.png


也可以给qplot添加图层

qplot(sleep_rem/sleep_total,awake,data = msleep) + geom_smooth()
qplot(sleep_rem/sleep_total,awake,data = msleep,geom = c("point","smooth"))
ggplot(msleep,aes(sleep_rem/sleep_total,awake)) + geom_point() +geom_smooth()

Clipboard Image.png

# 图形对象可以存储到一个变量里,summary函数可以帮助我们查看图形对象的结构而不用直接绘制出图形

p <- ggplot(msleep,aes(sleep_rem/sleep_total,awake))+geom_point()+geom_smooth()
p
summary(p)
data: name, genus, vore, order, conservation, sleep_total, sleep_rem, sleep_cycle, awake, brainwt,
bodywt [83x11]
mapping: x = sleep_rem/sleep_total, y = awake
faceting: <ggproto object: Class FacetNull, Facet>
compute_layout: function
draw_back: function
draw_front: function
draw_labels: function
draw_panels: function
finish_data: function
init_scales: function
map: function
map_data: function
params: list
render_back: function
render_front: function
render_panels: function
setup_data: function
setup_params: function
shrink: TRUE
train: function
train_positions: function
train_scales: function
vars: function
super: <ggproto object: Class FacetNull, Facet>
-----------------------------------
geom_point: na.rm = FALSE
stat_identity: na.rm = FALSE
position_identity

geom_smooth: na.rm = FALSE
stat_smooth: na.rm = FALSE, method = auto, formula = y ~ x, se = TRUE
position_identity


4.4 数据

ggplot2对于数据集要求:必须是一个数据框(data frame)

p <- ggplot(mtcars,aes(mpg,wt,colour = cyl)) + geom_point()
p

Clipboard Image.png

# 用%+% 添加新的数据集代替原来的数据集

mtcars <- transform(mtcars,mpg = mpg ^ 2)
p %+% mtcars

Clipboard Image.png

# 更改数据集时,可以任意改变它的值和维数,但是如果将一个变量从离散型变成连续型,或反之,那么也需要改变相应的默认标度

# 数据是以副本而不是引用的形式存储到图形对象中的,有两个好处:

# 一,如果数据改变了,绘图不会改变

# 二,ggplot2的对象都是自含型的(self-contained),所以它们可以被存储到磁盘上,并且之后可以被直接加载运行。



4.5 图形属性映射

# aes()函数用来将数据变量映射到图形中,从而使变量成为可以被感知的图形属性。

# aes(x = weight,y = height,colour = age)

# 前两个参数可以省略名字,可以使用变量的函数值作为参数

# aes(weight,height,colour = sqrt(age))

# 每个aes()函数里的变量都必须包含于默认数据集或者图层数据集中

# 这是保证ggplot2对象都是自含型的重要方式之一,这样方便存储和重复使用


4.5.1 图和图层

默认的图形属性映射可以在图形对象初始化时设定,或者过后用"+"修改

p <- ggplot(mtcars)
summary(p)
p <- p + aes(wt,hp)
summary(p)
p
data: mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb [32x11]
faceting: <ggproto object: Class FacetNull, Facet>
compute_layout: function


data: mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb [32x11]
mapping: x = wt, y = hp
faceting: <ggproto object: Class FacetNull, Facet>
compute_layout: function


图形对象p中默认的映射可以在新的图层里进行扩充或修改

p <- ggplot(mtcars,aes(x = mpg,y = wt))
p + geom_point()
p + geom_point(aes(colour = factor(cyl)))
p + geom_point(aes(y = disp))

Clipboard Image.pngClipboard Image.png


图层映射和默认映射aes(mpg,wt)的结合法则。图层图形属性可以添加,修改和删除

Clipboard Image.png


4.5.2 设定和映射

# 除了可以将一个图形属性映射到一个变量,你也可以在图层的参数里将其设定为一个单一值(例如,colour = "red")

# 图形属性可以根据观测的不同而变化,但是参数则不行

p <- ggplot(mtcars,aes(mpg,wt))
p + geom_point(colour = "darkblue")
p + geom_point(aes(colour = "darkblue"))

# 两个图形有很大区别

Clipboard Image.pngClipboard Image.png

#两者的区别

# 1,将颜色设定为“darkblue”

# 2,将颜色映射到“darkblue”,当颜色映射到“darkblue”时,“darkblue”将被看做一个普通的字符串,使用默认的颜色标度镜像标度转换


4.5.3 分组

# 默认使用 离散型变量来分组

# 如果没有呢?就需要自定义分组结构

library(nlme)
head(Oxboys)
Grouped Data: height ~ age | Subject
Subject age height Occasion
1 1 -1.0000 140.5 1
2 1 -0.7479 143.4 2
3 1 -0.4630 144.8 3
4 1 -0.1643 147.1 4
5 1 -0.0027 147.7 5
6 1 0.2466 150.2 6

# 多个分组与单个图形属性

# 下面的图,你可以看到每个男孩的成长轨迹,但是不能识别哪个男孩是哪条轨迹

# 如果没有正确分组,就会出现毫无意义的奇怪折线图

p <- ggplot(Oxboys,aes(age,height,group = Subject)) + geom_line()
p
q <- ggplot(Oxboys,aes(age,height)) + geom_line()
q

Clipboard Image.pngClipboard Image.png


# 不同图层上的不同分组

# 假设我们想根据所有男孩的年龄和身高在图中添加一条光滑的线条,如果使用前面的分组

p + geom_smooth(aes(group = Subject),method = "lm",se = F)

Clipboard Image.png

# 新的图层应该是 只需要关注整体趋势,修改代码

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

Clipboard Image.png

# 注意,我们已经将第一幅图存储到变量p中,可以在此基础上添加第二个图层,这样可以有效节省时间


# 修改默认分组

boysbox <- ggplot(Oxboys,aes(Occasion,height)) + geom_boxplot()
boysbox

# 这里无需设定组图形属性(group),因为Occasion是一个离散型变量,默认分组变量就是Occasion

# 在此基础上添加个体轨迹,我们需要用aes(group = Subject)修改第一层的默认分组

boysbox + geom_line(aes(group = Subject),colour = "#3366FF")

Clipboard Image.png


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

如何将个体的图形属性映射给整体的图形属性?

head(dsmall)
ggplot(dsmall,aes(color)) + geom_bar()
ggplot(dsmall,aes(color)) + geom_bar(aes(colour = cut))

Clipboard Image.pngClipboard Image.png


4.6 几何对象

# 几何图形对象,简称geom,它执行着图层的实际渲染,控制着生成的图像类型。

# 每个几何对象都有一组它能识别的图形属性和一组绘图所需的值。

# 例如,一个点含有颜色、大小和形状等图形属性,以及x和y位置坐标

# 一个条形含有高度、条宽、边界颜色和填充颜色等图形属性值

Clipboard Image.png

# 每个几何对象都有一个默认的统计变换,并且每个统计变换都有一个默认的几何对象。

# 例如,封箱(bin)统计变换默认使用条状几何对象(bar geom)来绘制直方图。

Clipboard Image.png


4.7 统计变换

# 简称stat,即对数据进行统计变换,它通常以某种方式对数据信息进行汇总。

# 例如,平滑(smoother)是一个很有用的统计变换,它能在一些限制条件的约束下计算给定x值时y的平均值。

Clipboard Image.png

# 统计变换可将输入的数据集看做输入,将返回的数据集作为输出,因此统计变换可以向原数据集中插入新的变量

# 例如,常被用来绘制直方图的stat_bin统计变换生成如下变量:

# count 每个组里观测值的数据

# density 每个组里观测值的密度(占整体的百分数)

# x 组的中心位置

# 这些生成变量可以被直接调用

# 直方图默认将条形的高度赋值为观测值的频数(count),也可以用密度(density)来代替

ggplot(dsmall,aes(carat)) + geom_histogram(aes(y = ..density..),binwidth = 0.1)
ggplot(dsmall,aes(carat)) + geom_histogram(aes(y = ..count..),binwidth = 0.1)

Clipboard Image.pngClipboard Image.png

# 生成变量的名字必须要用 ..围起来,这样可以防止原数据集中的变量和生成变量重名时造成混淆


4.8 位置调整

对该层中的元素位置进行微调

一般多见于处理离散型数据

Clipboard Image.png


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")

Clipboard Image.pngClipboard Image.png


4.9.2 显示已计算过的统计量

如果你有已经汇总过的数据,并且想直接用它,而不进行其他的统计变换,可以使用stat_identity(),然后将合适的变量映射到相应的图形属性中

推荐 0
本文由 Parlan怕冷 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册