拼图利器patchwork
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
p1 + p2 + p3 + p4
p1 + p2 + p3 + p4 + plot_layout(nrow=1)
2.2 |
用法
按行拼接图片。
p1 | p2
p1 | p2 | p3 | p4
2.3 /
用法
按列拼接图片。
p1 / p2
p1 / p2 / p3 / p4
2.4 ()
用法
图片分组,大大增加了代码的可读性。
(p1 + p2) / (p3 + p4)
(p1 | p2) / (p3 | p4)
(p1 / p2) | (p3 / p4)
(p1 / p2) | p3
(p1 | p2) / p3
2.5 +
、|
、/
和()
综合使用
两种构建九宫格的语句,其中 plot_spacer()
是用来填补空白的。
(p1 + plot_spacer() + p2) / (plot_spacer() + p5 + plot_spacer()) / (p3 + plot_spacer() + p4)
(p1 / plot_spacer() / p2) | (plot_spacer() / p5 / plot_spacer()) | (p3 / plot_spacer() / p4)
2.6 使用 plot_layout
调整图形长宽比例
p1 + p2 + (p3 + p4 + plot_layout(ncol = 1)) + p5 + plot_layout(widths = c(2, 1))
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)
2.7.2 无需网格直接布局
上面的布局虽然灵活性有所提高,但其本质和之前所介绍的基本用法并没有实质性的区别,都是先把图布划分成网格,然后再填入图片,所以不能实现叠加效果。
下面所介绍的是使用 area
来单独调整每个图片在画布中的位置,这样的好处就是可以实现任意的叠图和拼图。
下面的 t
、l
、b
和 r
分别表示图片的上、左、下和右边界在图布中的相对位置(注意:其中 l
必须不大于 r
,t
必须不大于 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)
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)
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 = ':')
参考资料:
1.patchwork github
2.cowplot是旧爱,patchwork乃新欢
3.Multiple plots in ggplot2 with patchwork