使用ggarrange堆叠共用X轴ggplot图:如何保留尺寸且仅底部显示X轴?
解决ggplot2堆叠共用轴时底部图被压缩的问题
我懂这个痛点!之前用ggarrange拼共用X/Y轴的图时也踩过这个坑——底部图因为要显示X轴标签和标题,绘图区域总是被挤得缩成一团,怎么调都别扭。这里有几个简洁的解决思路,亲测有效:
方法1:给ggarrange设置heights参数手动分配空间
如果坚持用ggpubr的ggarrange,核心是给底部图预留更多垂直空间,同时把上方子图的X轴元素全部隐藏:
library(ggplot2) library(ggpubr) # 生成示例数据 df <- data.frame(x = 1:10, y1 = rnorm(10), y2 = rnorm(10)+2, y3 = rnorm(10)+4) # 绘制子图:上方两个隐藏X轴的标签、刻度和标题 p1 <- ggplot(df, aes(x, y1)) + geom_line() + theme(axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank()) p2 <- ggplot(df, aes(x, y2)) + geom_line() + theme(axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank()) # 底部图保留完整X轴 p3 <- ggplot(df, aes(x, y3)) + geom_line() + labs(x = "共用X轴标题") # 垂直堆叠,用heights给底部图分配更大比例空间,align="v"保证轴对齐 ggarrange(p1, p2, p3, ncol = 1, align = "v", heights = c(1, 1, 1.3))
这里的heights = c(1,1,1.3)表示三个图的高度比例是1:1:1.3,底部图多出来的空间刚好容纳X轴元素,不会挤压绘图区域。
方法2:用patchwork包(更智能的堆叠方式)
patchwork是专门为ggplot2拼图设计的包,处理共用轴的场景比ggarrange更省心,语法也更简洁:
library(patchwork) # 用"/"实现垂直堆叠,自动对齐轴 (p1 / p2 / p3) + plot_layout(heights = c(1,1,1.3)) & # 同样给底部图留空间 theme(plot.margin = margin(5,5,5,5)) # 统一调整图间距
它会自动识别共用轴,不需要手动隐藏上方图的轴元素(当然隐藏后更美观),而且plot_layout的参数设置非常灵活。
方法3:用egg包的ggarrange(自动适配空间)
如果不想手动计算高度比例,可以试试egg包的ggarrange,它能自动根据轴元素的大小调整每个图的高度,完全不用手动设置heights:
library(egg) ggarrange(p1, p2, p3, ncol=1, align='v')
这个包的拼图逻辑更贴合ggplot的布局,会自动给有轴标签的图分配足够空间,解决压缩问题。
总结
- 若用ggpubr的ggarrange:必须手动设置
heights参数给底部图留空间; - 优先推荐patchwork或egg包:更智能,代码更简洁,能避免手动调参的麻烦。
内容的提问来源于stack exchange,提问作者Ryan Utz
相关产品推荐
相关产品推荐

