如何在ggsurvplot绘制的生存图中使用ggrepel添加曲线末端标签
生存曲线末端添加ggrepel标签的实现方案
报错原因
直接运行p + geom_label_repel()触发错误的核心原因是:geom_label_repel()必须明确传入标签内容、标签坐标的映射规则,以及对应的数据集,无参数调用时函数无法从ggsurvplot生成的基础图层中自动提取打标签所需的信息,因此运行失败。
可复现代码
实现逻辑是先筛选出每条生存曲线最末端的坐标点作为标签的锚点,再传入geom_label_repel()绘制防重叠标签:
# 加载依赖包 require("survival") library(survminer) library(ggrepel) library(dplyr) # 拟合生存模型 fit <- survfit(Surv(time, status) ~ sex, data = lung) # 绘制基础生存图,不需要图例可设置legend = "none" p <- ggsurvplot(fit, data = lung, legend = "none")$plot # 提取每条曲线的终点数据 curve_end <- p$data %>% group_by(strata) %>% slice_max(time, n = 1) %>% # 取每条曲线时间最大的终点行,老版本dplyr可替换为 filter(time == max(time)) ungroup() %>% # 自定义标签显示文本,不需要修改可跳过这步 mutate(curve_label = case_when( strata == "sex=1" ~ "男性组", strata == "sex=2" ~ "女性组" )) # 添加防重叠末端标签 p + geom_label_repel( data = curve_end, aes(x = time, y = surv, label = curve_label), nudge_x = 25, # 标签向x轴右侧偏移,避免贴在曲线上 direction = "y", # 仅在y轴方向调整位置防重叠,保持标签右对齐 hjust = 0, size = 3.8, segment.size = 0.5 # 标签到曲线终点的连线粗细 )
参数调整说明
- 如果不需要自定义标签文本,可删除
mutate步骤,将aes中的label = curve_label替换为label = strata,直接显示原始分组名 nudge_x的数值根据你数据的x轴范围调整,保证标签和曲线末端留出足够空隙即可- 如果曲线数量多、末端y值接近出现标签遮挡,可适当调大
box.padding参数增加标签间距 - 不需要标签和曲线之间的连线,可在
geom_label_repel中加参数segment.colour = NA隐藏连线
内容的提问来源于stack exchange,提问作者Flora Grappelli
相关产品推荐
相关产品推荐

