You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:55:20