cowplot是旧爱,patchwork乃新欢 - 卖萌控的博客
 首页 > 科研绘图 > cowplot是旧爱,patchwork乃新欢
2022
11-18

cowplot是旧爱,patchwork乃新欢

Thomas Lin Pedersen简直是个天才,最近patchwork动作很大,看到我都准备转投它的怀抱,把旧爱cowplot给扔了。

我们知道patchwork一出来,就推出+号来拼图,最近又搞出了|/两个操作符。让整个拼图看起来很舒服。

先来画几张图:

library(ggplot2)
p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle('图一')

p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle('图二')

p3 <- ggplot(mtcars) + geom_point(aes(hp, wt, colour = mpg)) + ggtitle('图三')

p4 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) + ggtitle('图四') 

拼图专用空白

plot_spacer()来填空白,一如既往地用+号来拼:

p1 + plot_spacer() + p2 + plot_spacer() + p3 + plot_spacer() 

拼图语法

+号大家都知道,按照row来拼,用/,按照column来拼,用|,这个语法绝了!而且一堆+号,在拼图多的时候也很乱,用/|配以()和换行,可读性太强了。

(p2 / p3 ) | p1 

控制细节

+/|毕竟是语法糖,要控制细节,全在plot_layout里。

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

超越网格

拼图都是把整张图分为网格,往里面填,当你要拼复杂点的时候,那就是嵌套去拼,比如在cowplot里,plot_gridplot_grid,这样你才能够使一张图在网格里占用不止一个格子。但嵌套有时候很难保证对齐。

layout <- " ##BBBB AACCDD ##CCDD " p1 + p2 + p3 + p4 + plot_layout(design = layout) 

这里#代表空白,ABCD分别对应这四张图,这个layout中ABCD的位置,就对应于图在网络中的位置。

你还可以用area来指定在网络中的位置,这样更加容易编程控制细节:

layout <- c( area(t = 2, l = 1, b = 5, r = 4), area(t = 1, l = 3, b = 3, r = 5)
)
p1 + p2 + plot_layout(design = layout) 

当然这些格子的相对高度和宽度,也是可以通过playout_layout中的widthsheights参数控制的。

控制legend

指定guides='collect'可以帮助我们把legend都给集中在一起,放到图的一侧:

g <- ggplot(mtcars) + geom_point(aes(mpg, disp, colour = mpg, size = wt))
g1 <- g + ggtitle("图一")
g2 <- g + scale_colour_viridis_c() + ggtitle("图二")

(p3 | (g1 / g2)) + plot_layout(guides = 'collect') 

如果想要图例单独放在一个格子,用guide_area()

g1 + p2 + p3 + guide_area() + plot_layout(guides = 'collect') 

转自:https://guangchuangyu.github.io/2019/11/patchwork/

最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情