R | patchwork更新

2022-01-24  本文已影响0人  尘世中一个迷途小书僮

自上一篇分享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支持将ggplotnon-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的图形大小,使之对齐。

这里提一下patchworknon-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:

https://patchwork.data-imaginist.com/

上一篇下一篇

猜你喜欢

热点阅读