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

使用ggarrange组合图表时图例过长导致的右侧对齐问题求助

解决ggarrange垂直组合图表右侧对齐问题

核心问题分析

你当前代码里的widths = c(1, 1, 5)是错误的——widths参数用来控制列方向的宽度比例,而你是垂直排列(ncol=1),应该用heights控制行高。这个错误会直接打乱水平方向的对齐,再加上底部图表的长图例,就导致了右侧错位。

解决方案一:统一共用图例(推荐)

因为三张图表结构完全一致,提取一个共用图例单独放置,让三张图表本身不带图例,这样所有绘图区域宽度完全一致,对齐问题自然解决:

# 1. 提取其中一张图的图例(选任意一张都可以)
shared_legend <- get_legend(plot_sex + theme(legend.box = "horizontal"))

# 2. 移除三张图自身的图例
plot_sex_noleg <- plot_sex + rremove("legend")
plot_ethnicity_noleg <- plot_ethnicity + rremove("legend")
plot_disability_noleg <- plot_disability + rremove("x.text") + rremove("legend")

# 3. 组合无图例的三张图,垂直对齐
plot_grid <- ggarrange(plot_sex_noleg, plot_ethnicity_noleg, plot_disability_noleg,
                       labels = c("A", "B", "C"),
                       ncol = 1, nrow = 3,
                       align = "v",
                       heights = c(1, 1, 1)) # 根据需求调整行高比例,比如想让底部图高一点就设c(1,1,1.2)

# 4. 把组合图和图例放在一起
final_plot <- ggarrange(plot_grid, shared_legend,
                        ncol = 2, nrow = 1,
                        widths = c(4, 1)) # 控制图表区和图例区的宽度比例,可按需调整

解决方案二:调整底部图表的图例尺寸

如果不想共用图例,可以缩小底部图表的图例,让它的宽度和另外两张图匹配:

# 缩小底部图表的图例文字和符号尺寸
plot_disability_adj <- plot_disability + 
  rremove("x.text") +
  theme(legend.box = "horizontal",
        legend.text = element_text(size = 8), # 缩小图例文字
        legend.key.size = unit(0.5, "cm")) # 缩小图例符号

# 修正参数,用heights代替widths
ggarrange(plot_sex, plot_ethnicity, plot_disability_adj,
          labels = c("A", "B", "C"),
          ncol = 1, nrow = 3,
          legend = "right",
          heights = c(1, 1, 1), # 垂直排列用heights控制行高
          align = "v")

关键注意点

  • 垂直排列时,永远用heights控制行高,widths只在水平排列(nrow=1)时使用。
  • align="v"只会对齐绘图区域,图例不属于绘图区域的一部分,所以统一图例是最彻底的对齐方案。

内容的提问来源于stack exchange,提问作者Alice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:45:04