美文网首页R语言echart
【R画图学习17.1】拼图软件1---patchwork

【R画图学习17.1】拼图软件1---patchwork

作者: jjjscuedu | 来源:发表于2022-11-18 17:04 被阅读0次

    其实前面在学习的时候也陆陆续续的用过一些拼图的包,像par,cowplot,patchwork等。但是,感受下来好像最好用的还是patchwork,所以今天详细的学习一下。因为最新版本里面支持将ggplot与non-ggplot对象进行拼接。并且还有其它很多优点:可以给子图添加标记(ABCD...);可以将子图的图例移到一起;可以统一修改子图;也可以直接p1+p2出图等。

    我们用自带的mtcars为例子,画4个简单的图。

    library(ggplot2)

    library(ggsignif)

    library(patchwork)

    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(cyl))+

    facet_wrap(~gear)+

    ggtitle("plot 4")

    横着拼就"|"或"+",竖着拼就"/"

    p1+p4  

    p1|p4

    两者效果一样,并且各占50%的空间比例。

    p1/p4

    这是竖着的效果,也是上下各占50%。

    当拼多张图时,默认情况下,patchwork拼图呈现的是正方形,按行排列。

    p1+p2+p3+p4

    以上的排版,可以通过后面跟plot_layout函数来进行调整。

    plot_layout(ncol = NULL, nrow = NULL,byrow = NULL,widths = NULL,heights = NULL,

    guides = NULL, tag_level = NULL,design = NULL)

    参数的含义:

    ncol, nrow:设定多少行,多少列,和

    byrow:默认是按行依次排列,设置FALSE就会按列依次排列

    widths, heights:每行,每列的相对宽度和高度

    design:手动指定布局中的位置信息

    tag_levels : 用来添加标签,例如:'a', 'A', '1', 'i, or 'I'

    p1+p2+p3+p4+plot_layout(ncol=3)  #指定了3列,然后按行依次排列

    甚至,还可以通过括号,作为一个整体来对待。

    p1|(p2|p3)

    比如这个就是p2 p3作为一个整体占了50%的空间。在这个空间内,他们又是水平排版的。

    p4/(p2|p3)

    这个就是另外一个排版的例子,p2和p3作为一个整体和p4上下排版。然后p2和p3内部左右排版。

    p4/(p1|(p2/p3))

    这就是相对来说,更复杂的例子。p1|(p2/p3)作为一个整体和p4上下排版。在下半区域内p1占了50% p2和p3共占剩下的50%,并且p2和p3上下排版。

    也可以自我设计布局格式,传递给design参数。

    design <- "

    AAA

    BBC

    DDD

    "

    通过design,我们设计了3行,第一行是一个量,第二行是2个量,第三行一个量

    p1+p2+p3+p4+plot_layout(design=design)

    下面我们看下widths和heights的控制。

    p1+p2+plot_layout(widths=c(2,1))

    可以看出通过c(2,1)相当于把空间按宽度分成了3份,第一个图占了2份既2/3。

    p1+p2+p3+plot_layout(widths=c(3,2,1))

    这个就是分成了3份,分别占比3/6, 2/6, 1/6。heights用法和widths相同。

    p4/(p1|(p2/p3))+plot_layout(heights=c(1,2))

    和前面类似。p4占据上区间1/3。p1|(p2/p3)占据下区间2/3。

    我们还可以变得更复杂点。

    p4/((p1|(p2/p3))+plot_layout(widths=c(1,2)))+plot_layout(heights=c(1,2))

    第一个widths用来控制p1 和p2/p3的占比布局。

    plot_annotation 用来设置总图的title

    (p1 | (p2 / p3)) + 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')

    tag_levels用来添加每个子图的标签。

    (p1 | (p2 / p3)) +

     plot_annotation(tag_levels = 'A')

    # tag_levels : 'a', 'A', '1', 'i, or 'I'

    当然还可以添加标签的前缀和后缀:

    # tag标签加前缀

    ((p1 | p2) / p3) +plot_annotation(tag_levels = 'A', tag_prefix = 'Fig. ')

    # tag标签加后缀

    ((p1 | p2) / p3) +plot_annotation(tag_levels = 'A', tag_suffix = ':')

    同时,patchwork也支持和其它图的拼图。

    p1 + ~plot(mtcars$mpg, mtcars$disp, main = 'Plot 2')

    p1+grid::textGrob("some test text!")

    文本拼图。

    在拼图中,最后一个图是active的,所以还可以加入ggplot的任意图层。

    test <- p1| p2 / p3

    test & theme(axis.text=element_text(size=15))

    我们通过&就可以统一修改图中的参数了。

    相关文章

      网友评论

        本文标题:【R画图学习17.1】拼图软件1---patchwork

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