前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R高级|cowplot包拼图(3):overlap

R高级|cowplot包拼图(3):overlap

作者头像
Chris生命科学小站
发布2023-02-28 19:50:34
1.1K0
发布2023-02-28 19:50:34
举报
文章被收录于专栏:Chris生命科学小站五年归档

强烈建议你读了前两节后,再来读次教程

R高级|利用cowplot包拼接图片(1)基本操作

R高级|利用cowplot包拼接图片(2)巧用NULL调节距离、排版

这次我们来讲overlap:图层叠加。我们要画下面这张图

有2种思路:

1、利用NULL,调节两张图片的位置,让两张图片靠近,距离为-1

2、像PS软件那样,图层一层一层叠加

0、准备3张图片A、B、B_black

图片A

代码语言:javascript
复制
library(ggplot2)
library(cowplot)
mpg$year = as.character(mpg$year)
A <- ggplot(mpg,aes(year,hwy)) + 
    geom_boxplot(outlier.colour = NA,width=0.2)+
    theme_half_open() 
A

图片B

代码语言:javascript
复制
B<-ggplot(mpg,aes(year,hwy)) + 
    geom_dotplot(binaxis = 'y',stackdir='center',
                 dotsize = 0.3,
                 stackratio=1,fill='red',color='red') +
    theme_half_open() 
B

B_black是图B去除了坐标轴上标题、标签、坐标线

代码语言:javascript
复制
B_black<-ggplot(mpg,aes(year,hwy)) + 
    geom_dotplot(binaxis = 'y',stackdir='center',
                 dotsize = 0.3,
                 stackratio=1,fill='red',color='red') +
    theme_half_open() +
    theme(axis.text = element_blank(),
          axis.title = element_blank(),
          axis.ticks = element_blank())
B_black

1、利用NULL

将2张图拼在一起

代码语言:javascript
复制
plot_grid(A,NULL,B,nrow=1)

水平对齐

代码语言:javascript
复制
plot_grid(A,NULL,B,nrow=1,
          align = 'h')

调节rel_width,默认3列的相对宽度都是1,调节第2列的相对宽为0

代码语言:javascript
复制
plot_grid(A,NULL,B,nrow=1,
          align = 'h',
          rel_widths = c(1,0,1))

调节第2列的相对宽为-1

代码语言:javascript
复制
plot_grid(A,NULL,B,nrow=1,
          align = 'h',
          rel_widths = c(1,-1,1))

设置垂直对齐,align='hv'

代码语言:javascript
复制
plot_grid(A,NULL,B,nrow=1,
          align = 'hv',
          rel_widths = c(1,-1,1))

2、叠加图层

使用align_plots将图片对齐

代码语言:javascript
复制
pl=align_plots(A,B_black)
View(pl)

我们可以看到,pl是一个list,长度是2,提取第1个元素命令是pl[[1]],也就是图A,提取第2个元素命令是pl[[2]],也就是图B_black。

我们使用ggdraw产生一个空图层,然后使用draw_plot,往这个图层上面一点一点加

产生空图层

代码语言:javascript
复制
ggdraw()

加图片A

代码语言:javascript
复制
ggdraw()+
    draw_plot(pl[[1]])

加图片B_black

代码语言:javascript
复制
ggdraw()+
    draw_plot(pl[[1]]) +
    draw_plot(pl[[2]])

我们看到2附图的x轴和y轴都没有对齐,我们在align_plots命令中加入对齐参数,然后再画图

水平对齐align = 'h'

代码语言:javascript
复制
pl=align_plots(A,B_black,align = 'h')
ggdraw()+
    draw_plot(pl[[1]]) +
    draw_plot(pl[[2]])

垂直对齐align = 'hv'

代码语言:javascript
复制
pl=align_plots(A,B_black,align = 'hv')
ggdraw()+
    draw_plot(pl[[1]]) +
    draw_plot(pl[[2]])

小结一下:

第1种思路:在2个图像之间添加NULL,然后调整NULL对应列的rel_widths为-1,设置2附图水平、垂直对齐。这个在少量图片的时候是可取的,当图片比较多的时候,就不灵了。

第2种思路:先使用align_plots设置2附图为垂直、水平对齐,使用ggdraw命令画1个空画布,然后使用draw_plot命令不断往上加,这个像极了PS中的操作,也和ggplot2风格一样。

3、overlap(2)

overlap到这里还没有结束,因为我们还没有画《R高级|利用cowplot包拼接图片(2)巧用NULL调节距离、排版》中最后的一幅图。

这幅图的overlap并没有将x轴和y轴对齐,而是将图片缩小、然后放在右上角,所以,我们并不要align_plot对齐x轴和y轴,直接使用ggdraw和draw_plot即可。

代码语言:javascript
复制
ggdraw()+
    draw_plot(A) +
    draw_plot(B,
              scale = 0.22,
              x=0.35,
              y=0.3)

总结:

到目前为止,我们花了3节内容,来讲解cowplot包拼图的2种模式

1、plot_gird命令,图片排版,结合NULL,可以灵活调节图片之间的距离,当NULL对应的相对宽度或相对高度为负数值,可以实现图片的overlap

2、使用ggdraw和draw_plot,来实现图层的叠加,如果需要图片的x轴和y轴都对齐的话,那么需要使用图片对齐命令align_plots,对图片进行对齐,生成一个list,然后再画图。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Chris生命科学小站 微信公众号,前往查看

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

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

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