在使用R语言绘制好图片后经常需要把图拼在一起,当然使用PPT或者adobe illustrator可以达到这一目的,但相对来说还是会有点麻烦。实际上我们可以使用R语言本身的功能来实现拼图,par和layout函数可以对R语言内置绘图包graphics画出的图进行排列,而patchwork包则是针对ggplot2包画出的图进行设计的

首先用graphics包和ggplot2包各简单绘制一幅图片
p_grahics <- hist(rnorm(100))
library(ggplot2)
data <- data.frame( x = 1:10, y = c(3, 5, 8, 7, 4, 6, 8, 10, 9, 12) )
p_ggplot2 <- ggplot(data, aes(x = x, y = y)) + geom_point() + labs(title = "Simple Scatter Plot", x = "X-axis", y = "Y-axis")

1 用par函数 绘制 2x2图片
par()函数是内置graphics包中的函数,其中的mfrow,mcol参数可用于指定行数和列数
original_par <- par() ##保存默认设置
par(mfrow=c(2,2)) ##设置为2x2,按行填充
for(i in 1:4){ plot(p_grahics) }
image

par(mfcol=c(2,2)) ##设置为2x2,按列填充
for(i in 1:4){ plot(p_grahics) }
image

par(original_par) ##恢复为默认设置

2 layout函数,par函数只能设置方格形式的拼格,必须一个方格一张图,当需要更自由的拼图方式时,可以使用layout函数
layout函数同样是内置graphics中的函数,主要参数如下
mat 参数为一个矩阵,提供了作图的顺序以及图形版面的安排。0代表空缺,不绘制图形,大于0 的数代表绘图顺序,相同数字代表占位符。
widths 和 heights 参数提供了各个矩形作图区域的长和宽的比例。
respect 参数控制着各图形内的横纵轴刻度长度的比例尺是否一样。
例子:
mat <- matrix(c(1,1,1, 2,0,3),nrow = 2, ncol = 3, byrow = TRUE)
layout(mat, widths = c(1,2,1), heights = c(1, 2), respect = FALSE)
layout.show(3)
image

3 patchwork包
事实上patchwork包可以拼接除了ggplot2图片以外的其它图片比如base系统图片,但这里主要介绍ggplot2图片的用法
library(patchwork)
使用+号来排列,"|"和"+"都是并行,但"|"优先级更高
p_ggplot2+p_ggplot2
image
在+号的基础上使用/号
p_ggplot2+p_ggplot2/p_ggplot2
image
(p_ggplot2+p_ggplot2)/p_ggplot2
image
添加空白占位
p_ggplot2+plot_spacer()+p_ggplot2
image

patchwork包还有许多其它功能,可以参考https://zhuanlan.zhihu.com/p/384456335