R的基础绘图功能是个自成体系的系统,尽管有许多工具包可以“一行代码绘制一幅图”,但是小编仍然认为系统地学习基础功能非常重要。
本篇推文是为了补全关于基础绘图系统的拼图功能的介绍,前面已经介绍了两种方法:
在阅读本篇推文之后,相信读者可以总结出不同方法的使用情境,进而迁移到ggplot2
绘图系统的相关功能上。
mfrow/mfcol
这两个参数只能在par()
函数中使用,对之后的绘图函数起作用。参数赋值形式如下:
par(mfrow = c(m, n))
par(mfcol = c(m, n))
以上代码表示,在一个绘图页面中绘制m行、n列个尺寸相同的图形;当图形铺满页面后(即图形数目达到m*n个)再新建绘图页面,并重复上述操作。
在排列图形顺序时,
mfrow
参数是先从左到右、再从上到下,即按行排列;mcol
参数是先从上到下、再从左到右,即按列排列;默认情况下,m和n的取值都是1,因此是一幅图形占据一个绘图页面;若想停止拼图,则要么将m和n重新设置为1,要么重启R。
x <- seq(-1, 0, 0.01)
y <- sqrt(1 - x^2)
par(mfrow = c(2,2))
plot(x, y)
plot(-x, y)
plot(x, -y)
plot(-x, -y)

将上述代码中的mfrow
参数替换成mfcol
参数,其他不变,效果如下:
x <- seq(-1, 0, 0.01)
y <- sqrt(1 - x^2)
par(mfcol = c(2,2))
plot(x, y)
plot(-x, y)
plot(x, -y)
plot(-x, -y)

x <- seq(-1, 0, 0.01)
y <- sqrt(1 - x^2)
par(mfrow = c(2,2), plt = c(0,1,0,1),
xaxs = "i", yaxs = "i")
plot(x, y, ann = F)
plot(-x, y, ann = F)
plot(x, -y, ann = F)
plot(-x, -y, ann = F)

layout()
layout()
函数是mfrow
和mfcol
参数功能的拓展版。它在排列图形时不再局限于尺寸大小必须相同、页面必须铺满。
语法结构如下:
layout(mat, widths = rep.int(1, ncol(mat)),
heights = rep.int(1, nrow(mat)),
respect = FALSE)
mat:矩阵;元素表示该位置的图形编号,其中0表示该位置不绘制图形;
widths、heights:各列的宽和各行的高(可以为绝对值,也可以为相对值)。
对于如下矩阵:
mat <- matrix(c(3,3,1,2), 2, 2,
byrow = T)
mat
## [,1] [,2]
## [1,] 3 3
## [2,] 1 2
默认尺寸是等宽等高的,它对应的图形布局如下:
layout.show(layout(mat))
通过widths
、heights
参数修改各子图的尺寸:
layout.show(layout(mat, widths = c(2,1),
heights = c(2,3)))

上述图中的数字即图形的编号,边框内为相应图形的绘制范围:
layout(mat, widths = c(2,1), heights = c(2,3))
set.seed(123)
opar <- par(no.readonly = TRUE)
x <- factor(rep(c(1,2), 50))
y <- rnorm(100)
hist(y)
plot(x, y)
par(plt = c(0.10, 0.96, 0.17, 0.95), mgp = c(2,1,0))
plot(1:100, y, ann = F)
par(opar)
