如何在ggplot中实现奇数个不同宽度图形的两列四行排版?
解决ggplot多图布局中跨列图形宽度问题
问题详情
我有7个ggplot图形,想要排布成两列四行的页面布局:前3行每行放2个图,第4行放第4个图(因为它宽度较长,需要跨两列)。但当前设置下第4个图只占单列宽度,用ggarrange和grid.arrange调整宽度都没生效。
尝试过的代码
ggarrange版本
ggarrange(plts[[1]], plts[[2]], plts[[3]], plts[[7]], plts[[5]], plts[[6]], plts[[4]], heights = c(1, 1, 1, 1, 1, 1, 15), widths = c(11, 13, 11, 13, 11, 13, 25), ncol = 2, nrow = 4)
grid.arrange版本
grid.arrange( grobs = plts, widths = c(11, 13), heights = c(5, 5, 5, 15, 5, 5, 5), layout_matrix = rbind(c(1, 2), c(3, 7), c(5,6), c(4)) )
问题图示:
解决方案
方案1:修正grid.arrange的布局设置
你用grid.arrange的代码里,layout_matrix最后一行只写了c(4),这会让第4个图默认只占第一列。要让它跨两列,需要把最后一行设为c(4,4),同时heights的长度要和行数匹配(4行对应4个高度值)。
修正后的代码:
library(gridExtra) grid.arrange( grobs = plts, widths = c(11, 13), # 前3行两列的宽度比例 heights = c(5, 5, 5, 15), # 四行的高度比例 layout_matrix = rbind(c(1, 2), c(3, 7), c(5, 6), c(4, 4)) # 让第4个图跨两列占据整行 )
方案2:用ggarrange嵌套组合布局
ggarrange无法直接指定单个图形跨列,所以可以先把前6个图组合成3行2列的布局,再将这个组合图和第4个图上下排列,实现跨列效果。
修正后的代码:
library(ggpubr) # 先组合前6个图为3行2列的布局 top_panel <- ggarrange(plts[[1]], plts[[2]], plts[[3]], plts[[7]], plts[[5]], plts[[6]], ncol = 2, nrow = 3, widths = c(11,13), heights = rep(1,3)) # 将组合好的顶部面板和第4个图上下排列 final_layout <- ggarrange(top_panel, plts[[4]], ncol = 1, nrow = 2, heights = c(3, 1.5)) # 调整上下部分的高度占比 print(final_layout)
内容的提问来源于stack exchange,提问作者Nmgh
相关产品推荐
相关产品推荐

