为了节省版面,我们通常会将多张图片合成一张图,在R语言中我们可以使用par( )或者layout( )函数来轻松实现这个功能。
1. 函数par( )的使用
在使用函数par( )时, 你需要添加参数mfrow=c(n, m) 去创建一个n行 x m列 的画布,画布中的每一格可以放一张图片,此时图片是按照行排列的。如果你想按照列排列,则需要改用参数mfcol=c(n, m)。
代码语言:javascript复制# 创建一个2行2列的画布
# 使用mtcars数据集作为示例
attach(mtcars) # 固定数据集
par(mfrow=c(2,2)) # 2行2列的画布,按行排列
plot(wt,mpg, main="Scatterplot of wt vs.mpg") # 绘制变量wt和 mpg之间的散点图
plot(wt,disp, main="Scatterplot of wt vsdisp") # 绘制变量wt和disp之间的散点图
hist(wt, main="Histogram of wt") # 绘制变量wt的直方图
boxplot(wt, main="Boxplot of wt") # 绘制变量wt的箱线图
代码语言:javascript复制# 创建3行1列的画布
attach(mtcars) # 固定数据集
par(mfrow=c(3,1)) # 3行1列画布,按行排列
hist(wt) # 绘制变量wt的直方图
hist(mpg) # 绘制变量mpg的直方图
hist(disp) # 绘制变量disp的直方图
2. 函数layout( )的使用
使用函数layout(mat)合并图片时需要注意其参数mat是一个矩阵,主要是用于指定单个图片的位置:
代码语言:javascript复制#画布第一行包含一张图片,而第二行包含两张图片
attach(mtcars)
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
hist(wt)
hist(mpg)
hist(disp)
另外,我们可以通过参数widths= 和 heights= 来更精准地控制每张图片的尺寸,其中widths= 代表的是每一列的宽度,heights= 代表的是每一行的高度:
代码语言:javascript复制# 画布第一行包含一张图片,而第二行包含两张图片
# 第一行的高度是第二行的1/3
# 第二列的宽度是第一列的1/4
attach(mtcars)
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE), widths=c(3,1),heights=c(1,2))
hist(wt)
hist(mpg)
hist(disp)
3. 图片高级合并
在接下来的例子里,我们将学会如何将两张箱线图添加到散点图上:
代码语言:javascript复制# 给散点图添加上箱线图
par(fig=c(0,0.8,0,0.8),new=TRUE)
plot(mtcars$wt, mtcars$mpg, xlab="CarWeight",
ylab="Miles Per Gallon")
par(fig=c(0,0.8,0.55,1), new=TRUE)
boxplot(mtcars$wt, horizontal=TRUE, axes=FALSE)
par(fig=c(0.65,1,0,0.8),new=TRUE)
boxplot(mtcars$mpg, axes=FALSE)
mtext("Enhanced Scatterplot", side=3,outer=TRUE, line=-3)
为了明白上述绘图原理,我们可以将整个画布理解成一个从左下角坐标点(0,0)到右上角坐标点(1,1)的平面坐标系,函数par( )里的参数fig=代表的就是图片左下角和右上角的坐标。
以第1个par( )函数的fig= c(0,0.8,0,0.8)为例,它实际上是指该图的横坐标从0到0.8,纵坐标也是从0到0.8,而第2个fig=c(0,0.8,0.55,1)则是指箱线图的横坐标从0到0.8,纵坐标从0.55到1,也即在上方的那个箱线图。
关于图形的合并就讲到这里,在后续的内容中我会简单和大家介绍一下如何使用“cowplot”包来对ggplot的对象进行合并,敬请期待!