自上一篇分享patchwork
的文章R | ggplot2拼图 —— patchwork过去2年多了,发现patchwork
又多了不少新功能。因此,这篇文章结合自己这段时间使用patchwork
的感受再介绍一下它的新功能
我们使用mtcars
的数据作为例子
library(ggplot2)
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggtitle('Plot 1')
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear)) +
ggtitle('Plot 2')
p3 <- ggplot(mtcars) +
geom_point(aes(hp, wt, colour = mpg)) +
ggtitle('Plot 3')
p4 <- ggplot(mtcars) +
geom_bar(aes(gear)) +
facet_wrap(~cyl) +
ggtitle('Plot 4')
对拼图进行批量ggplot语法操作
patchwork
提供了&
操作符,以让我们对拼接后的图的整体进行操作。
操作符+
只对其接着的一个图进行修改,而&
可以对所有图进行修改。
patchwork <- (p1 + p2 + theme_minimal())/(p1 + p2 & theme_minimal())
patchwork +
plot_annotation(tag_levels = list(c('+','','&','')))
与非ggplot对象拼接
目前,patchwork
支持将ggplot
与non-ggplot
对象进行拼接。
ggplot + grobs
我们可以将grobs
对象与ggplot
对象进行拼接
# adding non-ggplot object
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggtitle('p1')
p1 + grid::textGrob('Some really important text')
或者表格
p1 + gridExtra::tableGrob(mtcars[1:10, c('mpg', 'disp')])
ggplot + base graphics
另外,我们也可以将ggplot
与R的基础绘图对象进行拼接
# base graphics
p1 + ~plot(mtcars$mpg, mtcars$disp, main = 'Plot 2')
但我们可以注意到ggplot
与base graphics没办法很好的对齐。这时候我们需要手动调整base graphics的图形大小,使之对齐。
这里提一下patchwork
对non-ggplot
对象的拼接是通过wrap_elements()
实现的。我们接下来对base graphics进行wrap_elements()
操作后再修改
# align ggplot with base graphics
old_par <- par(mar = c(0, 0, 0, 0), mgp = c(1, 0.25, 0),
bg = NA, cex.axis = 0.75, las = 1, tcl = -0.25)
p1 +
wrap_elements(panel = ~plot(mtcars$mpg, mtcars$disp), clip = FALSE) +
ggtitle('Plot 2') +
theme(plot.margin = margin(5.5, 5.5, 5.5, 35))
par(old_par)
non-ggplot + ggplot
我们对non-ggplot
的添加都是加在ggplot
的右侧,可以把+
理解为一个函数而它左侧接受的第一个参数需要是ggplot
对象。所以如果我们需要添加non-ggplot
对象在左侧时,要先用wrap_elements()
将其转换。
# first plot non-ggplot
wrap_elements(grid::textGrob('Text on left side')) + p1
函数式拼图
有时候,当我们有一个列表存储多个图时,手动地用+
一个个拼接会比较费劲。幸好patchwork
提供了wrap_plots()
这一函数以自动拼接多个图。
# functional assembly
pls <- lapply(as.list(colnames(mtcars)[-1]), function(y) ggplot(mtcars, aes_string('mpg',y)) + geom_point())
wrap_plots(pls)
有了wrap_plots()
当我们用函数批量生成图时,也可以一次拼接起所有的图了。
注释
接下来,再简单介绍patchwork
的注释系统.
我们可以通过plot_annotation()
对拼接后的图添加注释
patchwork <- (p1 + p2) / p3
patchwork + plot_annotation(
title = 'The surprising truth about mtcars',
subtitle = 'These 3 plots will reveal yet-untold secrets about our beloved data-set',
caption = 'Disclaimer: None of these plots are insightful'
)
通常在文章的图里,我们会用字母表示不同的panels,使用plot_annotation
也可以很方便地实现对拼图的标注
patchwork + plot_annotation(tag_levels = 'A')
或者更复杂的标注
patchwork +
plot_annotation(tag_levels = c('A', '1'), tag_prefix = 'Fig. ', tag_sep = '.',
tag_suffix = ':') &
theme(plot.tag.position = c(0, 1),
plot.tag = element_text(size = 8, hjust = 0, vjust = 0))
总而言之,patchwork
是个十分方便且强大的ggplot
拼图工具。本文也只是简单介绍它,还有更多有趣的使用方法等待大家发现!
完。
Ref:
网友评论