参考资料:R语言实战【第2版】
在R种使用函数par()或layout()可以容易地组合多幅总括图形。
我们可以在par()函数中使用图形参数mfrow=c(nrows,ncols)来创建按行填充的行数为nrows、列数为ncols的图形矩阵。另外,可以使用mfcol=c(nrows,ncols)按列填充矩阵。
mfrow即“multiple figures row-wise”,表示将多个图形以行的方式排列在一个图形设备中。
# 示例1
# 使用系统自带的mtcars数据集
attach(mtcars)
# 设置参数
opar<-par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(wt,mpg,main="Scatterplot of wt vs. mpg")
plot(wt,disp,main="Scatterplot of wt vs. disp")
hist(wt,main='Histogram of wt')
boxplot(wt,main='Boxplot of wt')
par(opar)
detach(mtcars)
# 示例2
attach(mtcars)
opar<-par(no.readonly=TRUE)
par(mfrow=c(3,1))
hist(wt)
hist(mpg)
hist(disp)
par(opar)
detach(mtcars)
函数layout()的调用形式为layout(mat),其中mat是一个矩阵,它指定了所要组合的多个图形的所在位置。以下代码表示:第一幅图被置于第1行,另外两幅图被置于第2行。
attach(mtcars)
layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))
hist(wt)
hist(mpg)
hist(disp)
detach(mtcars)
为了更精确地控制每幅图形的大小,可以有选择地在layout()函数中使用widths=和heights=两个参数。其形式为:
widths=各列宽度值组成的一个向量
heights=各行高度值组成的一个向量
相对宽度可以直接通过数值指定,绝对宽度(以厘米为单位)可以通过函数lcm()来指定。
在以下代码中,我们再次将一幅图形置于第1行,两幅图形置于第2行。但第1行中图形的
高度是第2行中图形高度的二分之一。除此之外,右下角图形的宽度是左下角图形宽度的三分
之一:
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)
detach(mtcars)
如果我们想通过排布或叠加若干图形来创建单幅的、有意义的图形,这需要有对图形布局的精细控制能力。我们可以使用图形参数fig=完成这个任务。如下代码:通过在散点图上添加两幅箱线图,创建了单幅的增强型图形。
opar<-par(no.readonly=TRUE)
# 主区域设置散点图
par(fig=c(0,0.8,0,0.8))
plot(mtcars$wt,mtcars$mpg,
xlab='Miles Per Gallon',
ylab='Car Weight')
# 在上方添加箱线图
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)
par(opar)