美文网首页
R | patchwork更新

R | patchwork更新

作者: 尘世中一个迷途小书僮 | 来源:发表于2022-01-24 15:03 被阅读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/

    相关文章

      网友评论

          本文标题:R | patchwork更新

          本文链接:https://www.haomeiwen.com/subject/bzybhrtx.html