R语言作图的拼接操作(patchwork,基础知识)
2021-06-17 本文已影响0人
单细胞空间交响乐
最近年中总结,我们抽空学习一下简单的基础知识,虽然是基础,但是绝不可小视
我们知道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))
图片.png
超越网格
拼图都是把整张图分为网格,往里面填,当你要拼复杂点的时候,那就是嵌套去拼,比如在cowplot
里,plot_grid
套plot_grid
,这样你才能够使一张图在网格里占用不止一个格子。但嵌套有时候很难保证对齐。
layout <- "##BBBBAACCDD##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
中的widths
和heights
参数控制的。
控制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')
图片
它厉害就厉害在会把所有图的图例都收集,并且会比较,不同的,比如说g1和g2的颜色映射不一样,图例都有,而点大小的图例是一样的,只出来一个。比较图例这个工作,必须服。
如果想要图例单独放在一个格子,用guide_area()
:
g1 + p2 + p3 + guide_area() + plot_layout(guides = 'collect')
图片
很好用,大家多多学习,提升自己的作图水平~~