学习这一篇教程的前提是:已经学习了上一篇《R高级|利用cowplot包拼接图片(1)基本操作》,并且熟悉了cowplot包中plot_grid函数的基本操作,我们仍然使用上一篇中的A、B、C、D四幅图在本节中进行演示。
本节,我们来讲如何调节图片之间的距离。
在cowplot包中并没有直接调节图片距离的函数,但是我们仍然有方法解决。
图片的距离有2种:相对距离和绝对距离。
0、组图
library(cowplot)
plot_grid(A,B)
1、调节相对距离
相对距离指的是随着图片的大小不断改变,图片大,图片之间的距离就变小,图片小,图片之间的距离就大。使用plot_grid函数中的scale参数,这个我们在上一节谈到过。
scale分别设置为1、0.5、0.1
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
plot_grid(A,NULL,B,nrow = 1)
我们看到,A和B之间多了一个空白区域,明显比之前宽多了。这是因为A和B之间多了一个空图(NULL),注意空图也是图啊,所以这幅图是1行×3列的图,有3附图:图A、空图、图B,我们给三个图加上标签
plot_grid(A,NULL,B,nrow = 1,
labels = c('A', '空图', 'B'))
空图也是图啊,所以我们添加了3个标签,切记切记!
现在,图形是1行×3列,我们使用rel_widths来调节3列的相对宽度,将第2个数值设置的较小,来使第2列的宽度变窄
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的排列,和想要的真实排列一致,这是一个非常好的习惯,这样在复杂情况下,更容易核对。
plot_grid(A,B,
C,D,
labels = c('A','B',
'C','D'))
现在的图片是2行2列,如果我想调节第1列和第2列的之间的距离(再次强调:距离的调节是以行、列为单位,并不是某一幅图),那么,需要在A图和C图后面都加一个NULL,实现加入1个空列,将图片变成2行3列。
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
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。
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)中。
pl=list(A,B,
C,D)
pl也可以这么写
pl=c(list(A),list(B),
list(C),list(D))
第2种写法,在循环中更为常见。
再将pl赋值给plotlist,即可画图
plot_grid(plotlist = pl,
labels = c('A','B',
'C','D'))
现在的图形是2行×2列,我们想调节第1行和第2行的距离,按照上面所说的,需要在两行之间加1行,也就是在B图后面加入2个空图(NULL),组成一个新的空行
pl=list(A, B,
NULL,NULL,
C, D)
或者
pl=c(list(A), list(B),
list(NULL),list(NULL),
list(C), list(D))
后一种写法在循环中更为常见。
plot_grid(plotlist = pl,ncol=2,
labels = c('A','B',
'空图','空图',
'C','D'))
现在的图形是3行×2列,我们通过rel_heights,来调节第1行和第3行之间的距离。
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 ,我们将其全部画出来
plot_grid(A,NULL,
NULL,B,
labels = c('A','空图',
'空图','D')
)
再说一次:空图也是图啊!
现在,来调节相对宽度,使第1列变窄
plot_grid(A,NULL,
NULL,B,
labels = c('A','空图',
'空图','D'),
rel_widths = c(0.3,1)
)
再来调节相对高度,使第1行变窄
plot_grid(A,NULL,
NULL,B,
labels = c('A','空图',
'空图','D'),
rel_widths = c(0.3,1),
rel_heights = c(0.3,
1)
)
最后,将“空图”两个字换成空字符串
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上面,做成这样。