如何正确合并两个ggplot并对齐坐标轴、分条与标题?
ggplot图形合并问题的解决方案
核心问题与修复思路
- 标签对齐问题:(A)(B)是分面的strip文本,(C)是绘图标题,两者布局逻辑不同,需统一为分面标签实现对齐
- y轴对齐问题:需统一两个图的y轴范围、纵横比,并在合并时启用垂直对齐
修复后的完整代码
library(ggplot2) library(dplyr) library(patchwork) # 第一个分面图:修正cyl数值判断,统一y轴范围 p1 <- mtcars %>% filter(cyl %in% c(4, 6)) %>% mutate(cyl_label = paste0("label_", cyl)) %>% ggplot(aes(x = mpg, y = wt)) + geom_point() + theme_bw() + theme(aspect.ratio = 2, strip.text.x = element_text(hjust = 0, colour = "black", size = 14, margin = unit(c(t=0.15,r=0,b=0.15,l=0), "cm")), strip.background = element_blank()) + facet_wrap(~ cyl_label, labeller = labeller(cyl_label = c(label_4 = "(A) First plot", label_6 = "(B) Second plot"))) + coord_cartesian(ylim = range(mtcars$wt)) # 锁定y轴范围 # 第二个图:用单分面替代标题,匹配p1的标签位置与y轴设置 p2 <- mtcars %>% ggplot(aes(x = hp, y = wt)) + geom_point() + theme_bw() + theme(aspect.ratio = 2, # 统一纵横比,保证y轴视觉长度一致 strip.text.x = element_text(hjust = 0, colour = "black", size = 14, margin = unit(c(t=0.15,r=0,b=0.15,l=0), "cm")), strip.background = element_blank()) + facet_wrap(~ factor("dummy"), labeller = labeller(`factor("dummy")` = "(C) Third plot")) + coord_cartesian(ylim = range(mtcars$wt)) # 同步y轴范围 # 合并图形:启用垂直对齐,保证轴完全对齐 combined_plot <- p1 + p2 + plot_layout(ncol = 2, align = "v")
关键调整说明
- 标签对齐:把p2的标题换成单个分面的strip文本,让(C)和(A)(B)处于完全相同的布局位置,实现精准对齐
- y轴对齐:
- 用
coord_cartesian强制两个图使用相同的y轴范围,避免数据范围差异导致的轴偏移 - 统一两个图的
aspect.ratio,确保y轴的视觉长度一致 - 合并时添加
align="v"参数,让两个图的垂直轴完全对齐
- 用
内容的提问来源于stack exchange,提问作者Giuseppe Petri
相关产品推荐
相关产品推荐

