图形组合R包patchwork

mark

平常我们绘制图形的时候常常要将几幅图形组合在一起,有很多R包可以用于图形组合,经典的是gridExtra,还有egg。今天介绍一个新包 patchwork

安装

# install.packages("devtools")
devtools::install_github("thomasp85/patchwork")

例子

patchwork的使用非常简单,就是利用**+**将图形组合起来。

library(ggplot2)
library(patchwork)
p1 <- ggplot(mtcars)+geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars)+geom_boxplot(aes(gear, disp, group=gear))
# Combine these two plots together
p1+p2

mark

布局

patchwork提供了一个专门用于图形布局的函数plot_layout(),这样我们就可以自定义布局的行列数了

p1+p2+plot_layout(ncol = 1, heights = c(3,1))

mark

如果需要在组合的图形之间留点空间,使用plot_spacer()就行了

p1+plot_spacer()+p2

mark

还可以将不同图形用{}封装,这样可以实现双重布局

p3 <- ggplot(mtcars)+geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars)+geom_bar(aes(carb))
# nested plots layout
p4+{
  p1+{
    p2+
      p3+
      plot_layout(ncol = 1)
  }
}+
  plot_layout(ncol = 1)

mark

高级参数

patchwork还提供了一些高级参数,比如/,/类似于操作符+,但是它可以将不同plots至于同一个nesting水平,具体如下:

# first we use + to add plots and layout
(p1+p2)+p3+plot_layout(ncol = 1)

mark

可以看出p1+p2组合之后并没有处于同一nesting水平

# then we use /
(p1+p2)/p3 + plot_layout(ncol = 1)

mark 此时p1+p2先组合在同一水平再与p3组合

另外再介绍两个操作符:*^ 这两个有点类似于正则表达式里的通配符了,主要是为了减轻代码量。比如如果我们需要修改所有plots的背景,就没必要每个plot都修改一遍了。这两个操作符的主要区别是*只改变处于当前nesting水平的所有plots,^则修改所有plots,具体如下:

(p1+(p2+p3)+p4+plot_layout(ncol = 1))*theme_bw()

mark

可以看到这里只修改了p1和p4的背景主题,(p2+p3)没有修改

(p1+(p2+p3)+p4+plot_layout(ncol = 1))^theme_bw()

mark

这里所有的plots的主题背景都被修改了。 目前这个包还处于开发阶段,将来还有很多功能会被加进去,我们拭目以待吧

SessionInfo

sessionInfo()
## R version 3.4.3 (2017-11-30)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 16299)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Chinese (Simplified)_China.936 
## [2] LC_CTYPE=Chinese (Simplified)_China.936   
## [3] LC_MONETARY=Chinese (Simplified)_China.936
## [4] LC_NUMERIC=C                              
## [5] LC_TIME=Chinese (Simplified)_China.936    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] patchwork_0.0.1    ggplot2_2.2.1.9000
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.14      digest_0.6.13     rprojroot_1.2    
##  [4] plyr_1.8.4        grid_3.4.3        gtable_0.2.0     
##  [7] backports_1.1.2   magrittr_1.5      evaluate_0.10.1  
## [10] scales_0.5.0.9000 rlang_0.1.4       stringi_1.1.6    
## [13] lazyeval_0.2.1    rmarkdown_1.8     labeling_0.3     
## [16] tools_3.4.3       stringr_1.2.0     munsell_0.4.3    
## [19] yaml_2.1.16       compiler_3.4.3    colorspace_1.3-2 
## [22] htmltools_0.3.6   knitr_1.17        tibble_1.3.4
Researcher

I am a PhD student of Crop Genetics and Breeding at the Zhejiang University Crop Science Lab. My research interests covers a range of issues:Population Genetics Evolution and Ecotype Divergence Analysis of Oilseed Rape, Genome-wide Association Study (GWAS) of Agronomic Traits.

comments powered by Disqus