大家对ggplot2的绘图语法应该都很熟悉,但是如何多个图进行合理的拼接,一直是很头疼的事情,于是就有了patchwork包的诞生。此包主要的功能就是来对绘制的ggplot结果进行拼接展示。我们首先看下包的安装:
install.packages("patchwork")
接下来通过实例给大家看下此包具体的使用方法:
1. 基础的图形
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')
2. 基础拼接
p1 + p2 ##p1 |p2
p1 + p2 + p3 + p4
p1 / p2
3. 复杂拼接
(p1+p2+p3)/p4
p1 | (p2 / p3)
4. 复杂的修饰
####为子图添加子标题
p1 + p2 + labs(subtitle = 'This will appear in the last plot')##labs为前一个子图添加
###设置整个页面的布局
p1 + p2 + p3 + p4 + plot_layout(nrow = 3, byrow = F)
###为图添加子图
p1 + inset_element(p2, 0.6, 0.6, 1, 1)
###添加总的标题
p1 + p2 +plot_annotation(
title = 'This is a title',
caption = 'made with patchwork',
theme = theme(plot.title = element_text(size = 16))
)
###为子图编号
p1 / (p2 | p3) +plot_annotation(tag_levels = 'A')
###自定义编号符号
p1 / ((p2 | p3) + plot_layout(tag_level = 'new')) +plot_annotation(tag_levels = list(c('&', '%'), '1'))
###自定义布局
design <- c(
area(1, 1, 2),
area(1, 2, 1, 3),
area(2, 3, 3),
area(3, 1, 3, 2),
area(2, 2)
)
plot(design)
在这里给大家解释下这个布局的构造原理,首先需要用到函数area(T,L,B=T,R=L)其中TLBR分别对应上左下右,在不设置BR时候,B=T 并且R=L。例如area(1,1,2)=area(1,1,2,1),指第一行第一列竖着第二行起至第一列;area(1, 2, 1, 3)指第一行第二列竖着第一行起至第三列;area(3, 1, 3, 2)指第三行第一列竖着第三行起至第二列。
p1 + p2 + p3 + p4 + p5 + plot_layout(design = design)
###简化方案
design <- "
1##
123
##3
"
p1 + p2 + p3 + plot_layout(design = design)
如上的原理就是利用#进行空缺填补,或者将图像编号进行九宫格的列出。
###子图间隔设置
(p1 + theme(plot.margin = unit(c(0,30,0,0), "pt"))) +
(p2 + theme(plot.margin = unit(c(0,0,0,30), "pt")))
###为子图添加局部区域放大图/缩小图
p1 + wrap_elements(panel = p1 + ggtitle('Look at me shrink'))
###对齐子图
p6<- ggplot(mtcars) + geom_point(aes(mpg, disp))
library(gtable)
library(grid)
p2_table <- ggplotGrob(p2)
p6 + wrap_ggplot_grob(p2_table)