使用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
相关产品推荐
相关产品推荐

