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

如何正确合并两个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轴对齐:
    1. 用coord_cartesian强制两个图使用相同的y轴范围,避免数据范围差异导致的轴偏移
    2. 统一两个图的aspect.ratio,确保y轴的视觉长度一致
    3. 合并时添加align="v"参数,让两个图的垂直轴完全对齐

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:49:57