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

