首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R高级|利用cowplot包拼接图片(2)巧用NULL调节距离、排版

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

作者头像
Chris生命科学小站
发布2023-02-28 19:51:49
发布2023-02-28 19:51:49
3K00
代码可运行
举报
运行总次数:0
代码可运行

学习这一篇教程的前提是:已经学习了上一篇《R高级|利用cowplot包拼接图片(1)基本操作》,并且熟悉了cowplot包中plot_grid函数的基本操作,我们仍然使用上一篇中的A、B、C、D四幅图在本节中进行演示。

本节,我们来讲如何调节图片之间的距离。

在cowplot包中并没有直接调节图片距离的函数,但是我们仍然有方法解决。

图片的距离有2种:相对距离和绝对距离。

0、组图

代码语言:javascript
代码运行次数:0
运行
复制
library(cowplot)
plot_grid(A,B)

1、调节相对距离

相对距离指的是随着图片的大小不断改变,图片大,图片之间的距离就变小,图片小,图片之间的距离就大。使用plot_grid函数中的scale参数,这个我们在上一节谈到过。

scale分别设置为1、0.5、0.1

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,B,scale = 1)
plot_grid(A,B,scale = 0.5)
plot_grid(A,B,scale = 0.1)

图片不断变小,距离不断增大。

2、调节绝对距离

绝对距离指的是图片之间的距离与图片大小无关。

rel_heigths和rel_widths用来调节行、列的相对高度和相对宽度,注意:这是调节列和行,并不是某一张图片。如果我们想调节A、B两列之间的距离,那么可以在A、B中间加入1个空列(NULL),然后缩窄这个空列的相对宽度,就可以拉近A、B。

对!就是这个思路,既然不能直接调节行列的距离,那么,我们可以加入空列(NULL)、空行(NULL),通过调节空列、空行的相对高度、宽度,来调节非空列的距离。

①在A和B中加入空列NULL

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,B,nrow = 1)

我们看到,A和B之间多了一个空白区域,明显比之前宽多了。这是因为A和B之间多了一个空图(NULL),注意空图也是图啊,所以这幅图是1行×3列的图,有3附图:图A、空图、图B,我们给三个图加上标签

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,B,nrow = 1,
          labels = c('A', '空图', 'B'))

空图也是图啊,所以我们添加了3个标签,切记切记!

现在,图形是1行×3列,我们使用rel_widths来调节3列的相对宽度,将第2个数值设置的较小,来使第2列的宽度变窄

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,B,nrow = 1,
          labels = c('A','空图','B'),
          rel_widths = c(1,0.2,1))

rel_widths中的1, 0.2, 1分别和第1列、第2列、第3列相对应,意思是:第1列的宽度是第2列的5倍,和第3列相等,看一下效果。

我们发现,第1列和第2列的距离明显变小了。

②再来看一下4附图的情况

为了便于调节,在多幅图的时候,建议在plot_gird命令中图形对象A、B、C、D的排列,标签labels的排列,和想要的真实排列一致,这是一个非常好的习惯,这样在复杂情况下,更容易核对。

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,B,
          C,D,
          labels = c('A','B',
                    'C','D'))

现在的图片是2行2列,如果我想调节第1列和第2列的之间的距离(再次强调:距离的调节是以行、列为单位,并不是某一幅图),那么,需要在A图和C图后面都加一个NULL,实现加入1个空列,将图片变成2行3列。

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,B,
          C,NULL,D,
          labels = c('A','空图','B',
                     'C','空图','D'))

这时候的图片2行×3列,第一列是A、C,第2列是2个空图,第3列是B、D,现在,我们要调节第1列和第2列的距离,我们仍然使用rel_widths

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,B,
          C,NULL,D,
          labels = c('A','空图','B',
                     'C','空图','D'),
          rel_widths = c(1,0.01,1))

这个时候rel_widths的意思是:第1列的宽度是第2列的100倍,和第3列相等。

这个时候,中间第2列的相对宽度明显变窄,从而实现了对第1列和第3列距离的缩短,我们看到图C和图D下面没有对齐,使用align命令使其对齐即可,这个咱们在第1讲中介绍过,align可以等于v、h、hv、vh。

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,B,C,NULL,D,
          labels = c('A','空图','B','C','空图','D'),
          rel_widths = c(1,0.01,1,1,0.01,1),
          align = 'vh')

③调节垂直距离

上面讲的都是调节水平方向的举例,使用rel_width,如果想调节垂直举例,使用rel_heights即可实现,例子在下面。

3、list中调节绝对距离

比如,我们将A、B、C、D四幅图打包在一个list:pl(plot list)中。

代码语言:javascript
代码运行次数:0
运行
复制
pl=list(A,B,
        C,D)

pl也可以这么写

代码语言:javascript
代码运行次数:0
运行
复制
pl=c(list(A),list(B),
     list(C),list(D))

第2种写法,在循环中更为常见。

再将pl赋值给plotlist,即可画图

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(plotlist = pl,
          labels = c('A','B',
                     'C','D'))

现在的图形是2行×2列,我们想调节第1行和第2行的距离,按照上面所说的,需要在两行之间加1行,也就是在B图后面加入2个空图(NULL),组成一个新的空行

代码语言:javascript
代码运行次数:0
运行
复制
pl=list(A, B,
        NULL,NULL,
        C, D)

或者

代码语言:javascript
代码运行次数:0
运行
复制
pl=c(list(A),   list(B),
     list(NULL),list(NULL),
     list(C),   list(D))

后一种写法在循环中更为常见。

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(plotlist = pl,ncol=2,
          labels = c('A','B',
                    '空图','空图',
                     'C','D'))

现在的图形是3行×2列,我们通过rel_heights,来调节第1行和第3行之间的距离。

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(plotlist = pl,ncol=2,
          labels = c('A','B',
                    '空图','空图',
                    'C','D'),          
          rel_heights = c(1,
                          0.1,
                          1))

这个时候rel_heights的意思是:第1行的高度是第2行的10倍,和第3行相等,注意看,为了方便核对,我将rel_heights也竖直写了,看一下效果。

4、巧用NULL,rel_width,rel_heights来实现排版

现在,我们想画这样一张图,相信大家肯定在杂志上看到过类似的图,左上角一个小图,右下角一个大图。

这张图其实是一个2行×2列,在这幅图中,有4幅图:A、空图、空图、B ,我们将其全部画出来

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,
          NULL,B,
          labels = c('A','空图',
                    '空图','D')
          )

再说一次:空图也是图啊!

现在,来调节相对宽度,使第1列变窄

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,
          NULL,B,
          labels = c('A','空图',
                    '空图','D'),
          rel_widths = c(0.3,1)
          )

再来调节相对高度,使第1行变窄

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,
          NULL,B,
          labels = c('A','空图',
                    '空图','D'),
          rel_widths = c(0.3,1),
          rel_heights = c(0.3,
                            1)
          )

最后,将“空图”两个字换成空字符串

代码语言:javascript
代码运行次数:0
运行
复制
plot_grid(A,NULL,
          NULL,B,
          labels = c('A','',
                      '','D'),
          rel_widths = c(0.3,1),
          rel_heights = c(0.3,
                            1)
          )

注意,空图也是图,空字符串也是字符串啊!

5、overlap

现在把图片A放在图片B上面,做成这样。

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

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

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

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

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