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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:29