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

在R语言组合多图中添加贯穿所有子图的VT1垂直线

解决VT1垂直线贯穿多子图的问题

核心思路

移除单个子图内的VT1垂直线和标注,在组合后的整体图上统一添加贯穿所有子图的垂直线,既保证视觉一致性,又提升可读性。

步骤1:修改单个子图代码

删除每个子图中绘制VT1垂直线和标注的代码,保留其他元素:

varia_plot <- df_sum %>% 
  filter(percent_power < 100) %>%
  ggscatter(x = "VE", y = "absVO2", color = "group", size = 0.5) +
  geom_smooth(aes(colour=group), method = "lm", formula = y ~ poly(x, 2)) +
  # 保留原有虚线,移除VT1相关实线
  geom_vline(aes(xintercept = percentPPO), linetype="dashed") +
  xlab("VE (L/min)") + 
  ylab(expression(paste("V", O[2]," (L/min)"))) +
  # 确保所有子图x轴范围完全一致,这是垂直线对齐的关键
  scale_x_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 25)) +
  theme_classic() +
  theme(
    panel.background = element_rect(fill="white", colour = "white"),
    axis.line = element_line(colour = "black"),
    legend.title = element_text(face = "bold"),
    legend.position = "none",
    strip.text = element_blank()
  )

注意:所有12张子图都要应用此修改,确保x轴范围统一为0-100。

步骤2:组合子图(保持原有代码)

用ggarrange按原布局组合子图:

plot <- ggarrange(variaVO2,
                  variaVE,
                  variaVO2fVE,
                  variaVCO2,
                  variaBF,
                  variaVCO2fVE,
                  variaHR,
                  variaVT,
                  variaVEVO2,
                  variaRER,
                  variaRmec,
                  variaVEVCO2,
                  labels = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"),
                  ncol = 3, nrow = 4)

步骤3:添加贯穿全局的VT1垂直线和标注

使用grid包在组合图上绘制贯穿所有子图的垂直线,以及对应的文本标注:

library(grid)

# 先画出组合好的子图
grid.draw(plot)

# 计算VT1对应的归一化x坐标(基于x轴0-100的范围)
x_pos_cad <- VT1PPO_CAD / 100  # 对应58%的话就是0.58
x_pos_healthy <- VT1PPO_healthy / 100  # 对应68%的话就是0.68

# 绘制红色垂直线(CAD组VT1)
grid.lines(x = unit(c(x_pos_cad, x_pos_cad), "npc"), 
           y = unit(c(0, 1), "npc"),  # 从图底部到顶部贯穿
           gp = gpar(col = "red", lwd = 1, lty = "solid"))

# 绘制蓝色垂直线(健康组VT1)
grid.lines(x = unit(c(x_pos_healthy, x_pos_healthy), "npc"), 
           y = unit(c(0, 1), "npc"),
           gp = gpar(col = "blue", lwd = 1, lty = "solid"))

# 添加VT1文本标注(放在图上部左侧,垂直显示)
grid.text(paste0("VT1: ", round(VT1PPO_CAD, 0), "%"), 
          x = unit(x_pos_cad - 0.02, "npc"), 
          y = unit(0.95, "npc"), 
          rot = 90, 
          gp = gpar(col = "red", fontsize = 10))

grid.text(paste0("VT1: ", round(VT1PPO_healthy, 0), "%"), 
          x = unit(x_pos_healthy - 0.02, "npc"), 
          y = unit(0.95, "npc"), 
          rot = 90, 
          gp = gpar(col = "blue", fontsize = 10))

关键注意事项

  • 必须保证所有子图的x轴范围完全相同,否则垂直线会出现错位。
  • 如果需要调整线条粗细、颜色或标注位置,修改gpar()中的参数即可(比如lwd调整线宽,fontsize调整文字大小)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:05:19