绘图布局patchwork

2022-03-14 14:49:24 浏览数 (2)

大家对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)

0 人点赞