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