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
注意,参数data和mapping在ggplot()函数和图层函数中的位置是相反的。
因为,在图形对象中一般先设定数据集,而在图层函数中大多是设定图形属性而不是数据集
# 下面的例子展示了两种绘图方法的等价性
ggplot(msleep,aes(sleep_rem/sleep_total,awake)) + geom_point()
qplot(sleep_rem/sleep_total,awake,data = msleep)
也可以给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()
# 图形对象可以存储到一个变量里,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
# 用%+% 添加新的数据集代替原来的数据集
mtcars <- transform(mtcars,mpg = mpg ^ 2)
p %+% mtcars
# 更改数据集时,可以任意改变它的值和维数,但是如果将一个变量从离散型变成连续型,或反之,那么也需要改变相应的默认标度
# 数据是以副本而不是引用的形式存储到图形对象中的,有两个好处:
# 一,如果数据改变了,绘图不会改变
# 二,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))
图层映射和默认映射aes(mpg,wt)的结合法则。图层图形属性可以添加,修改和删除
4.5.2 设定和映射
# 除了可以将一个图形属性映射到一个变量,你也可以在图层的参数里将其设定为一个单一值(例如,colour = "red")
# 图形属性可以根据观测的不同而变化,但是参数则不行
p <- ggplot(mtcars,aes(mpg,wt))
p + geom_point(colour = "darkblue")
p + geom_point(aes(colour = "darkblue"))
# 两个图形有很大区别
#两者的区别
# 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
# 不同图层上的不同分组
# 假设我们想根据所有男孩的年龄和身高在图中添加一条光滑的线条,如果使用前面的分组
p + geom_smooth(aes(group = Subject),method = "lm",se = F)
# 新的图层应该是 只需要关注整体趋势,修改代码
p + geom_smooth(aes(group = 1),method = "lm",size = 2,se = F)
# 注意,我们已经将第一幅图存储到变量p中,可以在此基础上添加第二个图层,这样可以有效节省时间
# 修改默认分组
boysbox <- ggplot(Oxboys,aes(Occasion,height)) + geom_boxplot()
boysbox
# 这里无需设定组图形属性(group),因为Occasion是一个离散型变量,默认分组变量就是Occasion
# 在此基础上添加个体轨迹,我们需要用aes(group = Subject)修改第一层的默认分组
boysbox + geom_line(aes(group = Subject),colour = "#3366FF")
4.5.4 匹配图形属性和图形对象
如何将个体的图形属性映射给整体的图形属性?
head(dsmall)
ggplot(dsmall,aes(color)) + geom_bar()
ggplot(dsmall,aes(color)) + geom_bar(aes(colour = cut))
4.6 几何对象
# 几何图形对象,简称geom,它执行着图层的实际渲染,控制着生成的图像类型。
# 每个几何对象都有一组它能识别的图形属性和一组绘图所需的值。
# 例如,一个点含有颜色、大小和形状等图形属性,以及x和y位置坐标
# 一个条形含有高度、条宽、边界颜色和填充颜色等图形属性值
# 每个几何对象都有一个默认的统计变换,并且每个统计变换都有一个默认的几何对象。
# 例如,封箱(bin)统计变换默认使用条状几何对象(bar geom)来绘制直方图。
4.7 统计变换
# 简称stat,即对数据进行统计变换,它通常以某种方式对数据信息进行汇总。
# 例如,平滑(smoother)是一个很有用的统计变换,它能在一些限制条件的约束下计算给定x值时y的平均值。
# 统计变换可将输入的数据集看做输入,将返回的数据集作为输出,因此统计变换可以向原数据集中插入新的变量
# 例如,常被用来绘制直方图的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)
# 生成变量的名字必须要用 ..围起来,这样可以防止原数据集中的变量和生成变量重名时造成混淆
4.8 位置调整
对该层中的元素位置进行微调
一般多见于处理离散型数据
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")
4.9.2 显示已计算过的统计量
如果你有已经汇总过的数据,并且想直接用它,而不进行其他的统计变换,可以使用stat_identity(),然后将合适的变量映射到相应的图形属性中