小编在撰写科研论文时,经常会使用 gridExtra[1] 包中 grid.arrange()
函数将多个图形进行组合展示。
以前基本使用默认几个参数就完事了,最近发现如果图形画布大小不同,组合后的图形会出现不对齐的问题,例如:(竖直方向上不对齐:下图标注的红线),看上去比较凌乱。
library(ggplot2) library(gridExtra) df <- data.frame( x = 1:10, y1 = 1:10, y2 = (1:10)^2, y3 = (1:10)^3, y4 = (1:10)^4 ) p1 <- ggplot(df, aes(x, y1)) + geom_point()+ theme_bw() p2 <- ggplot(df, aes(x, y2)) + geom_point()+ theme_bw() p3 <- ggplot(df, aes(x, y3)) + geom_point()+ theme_bw() p4 <- ggplot(df, aes(x, y4)) + geom_point()+ theme_bw() grid.arrange(p1, p2, p3, p4,nrow=2)
在搜集资料后发现cowplot[2]包能通过简单参数设置来快速对齐图片。小编以前介绍过这个包,可见:cowplot包,ggplot2图形排版R包,cowplot包:用R添加水印。
接下来看看,它是怎么实现的~
对齐后的图片
cowplot 包中的 plot_grid()
函数可以直接完成子图的对齐和排列。通过设置参数 aligh = 'v'
可以实现竖直方向对齐,aligh = 'h'
可以实现水平方向对齐,aligh = 'hv'
同时在两个方向对齐。
plot_grid(p1, p2, p3, p4, align = 'v')
此时,前面出现的问题基本解决了~接下来看看,其他常用的参数设置。
自动生成子图序号
如果需要给每个子图加上序号,设置参数 labels = "AUTO"
添加大写标签,labels = "auto"
添加小写标签。
plot_grid(p1, p2, p3, p4,align = 'v',labels = 'AUTO') #添加大写标签
调整图片长和宽的比例
修改参数 rel_widths
和 rel_heights
的值,就可以调整子图的长和宽的比例。例如,在一个两列的复合图中,rel_widths = c(2,1)
将使第一列子图的宽度是第二列的两倍。rel_heights
的工作原理与 rel_widths
相同,但用于行而不是列。
plot_grid( p1, p2, p3, p4, align = 'hv', rel_heights = c(2,1), rel_widths = c(1,2) )
插空排列图形
如果想要插空排列子图,只需要将对应位置的子图设置为 NULL
:
plot_grid( p1, NULL, NULL, p2, p3, NULL, ncol = 2, align = "v" )
适用于非 ggplot 生成的图形
对于非 ggplot 生成的图形,plot_grid()
函数也同样适用:
plot_grid( p1, NULL, NULL, p2, p3, NULL, ncol = 2, align = "v" )
小编有话说
- 多个图形合并在科研写作中非常常用。一种方式:通过 R 软件进行合并,并标注出对应信息,如本文所说。另一种方式:通过 LaTeX 的多图合并代码展示,如:LaTeX文档多图排版笔记 。
参考资料
[1]
gridExtra: https://cran.r-project.org/web/packages/gridExtra/index.html
[2]
cowplot: https://cran.r-project.org/web/packages/cowplot/vignettes/introduction.html