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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:15:43