其实前面在学习的时候也陆陆续续的用过一些拼图的包,像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))
我们通过&就可以统一修改图中的参数了。
网友评论