前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >绘图布局patchwork

绘图布局patchwork

作者头像
一粒沙
发布2022-03-14 14:49:24
7750
发布2022-03-14 14:49:24
举报
文章被收录于专栏:R语言交流中心R语言交流中心

大家对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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档