patchwork 在拼图时的优势是其形象简洁的语法。

1.安装

  R包的安装没啥好说的,而且安装这个包想报错都困难,下面是常规的两种安装方式。

install.packages('patchwork')
devtools::install_github("thomasp85/patchwork")

2.常用功能说明

加载包并构建示例图。

rm(list = ls())
library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('Title1')
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('Title2')
p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('Title3')
p4 <- ggplot(mtcars) + geom_bar(aes(carb)) + ggtitle('Title4')
p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl)) + ggtitle('Title5')

2.1 + 用法

连接图片。

p1 + p2

patchwork-1.png

p1 + p2 + p3 + p4

patchwork-2.png

p1 + p2 + p3 + p4 + plot_layout(nrow=1)

patchwork-3.png

2.2 | 用法

按行拼接图片。

p1 | p2

patchwork-4.png

p1 | p2 | p3 | p4

patchwork-5.png

2.3 / 用法

按列拼接图片。

p1 / p2

patchwork-6.png

p1 / p2 / p3 / p4

patchwork-7.png

2.4 () 用法

图片分组,大大增加了代码的可读性。

(p1 + p2) / (p3 + p4)

patchwork-8.png

(p1 | p2) / (p3 | p4)

patchwork-9.png

(p1 / p2) | (p3 / p4)

patchwork-10.png

(p1 / p2) | p3

patchwork-11.png

(p1 | p2) / p3

patchwork-12.png

2.5 +|/() 综合使用

两种构建九宫格的语句,其中 plot_spacer()是用来填补空白的。

(p1 + plot_spacer() + p2) / (plot_spacer() + p5 + plot_spacer()) / (p3 + plot_spacer() + p4)

patchwork-13.png

(p1 / plot_spacer() / p2) | (plot_spacer() / p5 / plot_spacer()) | (p3 / plot_spacer() / p4)

patchwork-14.png

2.6 使用 plot_layout 调整图形长宽比例

p1 + p2 + (p3 + p4 + plot_layout(ncol = 1)) + p5 + plot_layout(widths = c(2, 1))

patchwork-15.png

2.7 使用 plot_layout 自定义网格

  虽然前面的一些介绍已经能够满足大多数的要求,但是想更加灵活的布图,可以使用 plot_layout来实现。

2.7.1 更加精细的网格

  下面 layout 中的 ABCD 四个大写字母分别代表 p1、 p2、 p3 和 p4 四个图,其中 # 表示空白。

layout <- "
AABBBB
AACCDD
##CCDD
"
p1 + p2 + p3 + p4 + 
  plot_layout(design = layout)

patchwork-16.png

2.7.2 无需网格直接布局

  上面的布局虽然灵活性有所提高,但其本质和之前所介绍的基本用法并没有实质性的区别,都是先把图布划分成网格,然后再填入图片,所以不能实现叠加效果。
  下面所介绍的是使用 area 来单独调整每个图片在画布中的位置,这样的好处就是可以实现任意叠图拼图
  下面的 tlbr 分别表示图片的右边界在图布中的相对位置(注意:其中 l 必须不大于 rt必须不大于 b ),可以参照下面两个例子进行理解。

layout <- c(
  area(t = 1, l = 1, b = 2, r = 2),
  area(t = 1, l = 2, b = 1, r = 2)
)
p1 + p2 + 
  plot_layout(design = layout)

patchwork-17.png

layout <- c(
  area(t = 1, l = 1, b = 1, r = 1),
  area(t = 2, l = 2, b = 2, r = 2)
)
p1 + p2 + 
  plot_layout(design = layout)

patchwork-18.png

2.8 使用 plot_annotation 添加标签

  前面介绍了各种布局的操作,布局虽然重要,但是给图片添加标签同样也是刚需,比较简单,直接看下面例子。

p1 / ((p2 | p3) + plot_layout(tag_level = 'new')) +
  plot_annotation(title = 'This is a title',
                  caption = 'Made with patchwork',
                  theme = theme(plot.tag.position = c(0, 1),
                                plot.tag = element_text(size = 8, hjust = 0.5, vjust = 0),
                                plot.title = element_text(size = 16)),
                  tag_levels = c('A', '1'),# 'A','a','I','i','1'

                  tag_sep = '-', 
                  tag_prefix = 'Fig.',
                  tag_suffix = ':')

patchwork-19.png


参考资料:
1.patchwork github
2.cowplot是旧爱,patchwork乃新欢
3.Multiple plots in ggplot2 with patchwork