如何在ggsurvfit生存曲线y轴显示分位数的百分比生存概率
解决ggsurvfit分位数线显示生存概率百分比的方法
要在add_quantile添加的x=5垂直线旁显示对应生存概率的百分比,需要手动提取每个分组在该时间点的生存概率,再添加文本标注,具体步骤如下:
1. 提取目标时间点的生存概率
先拟合生存模型,再根据数据情况提取或插值计算每个分组在time=5时的生存概率,转换为百分比格式:
library(tidyverse) library(ggsurvfit) library(survival) # 拟合生存模型 fit <- survfit2(Surv(time, status) ~ surg, data = df_colon) # 情况1:如果time=5是模型输出中的精确时间点,直接提取 surv_prob_5 <- broom::tidy(fit) %>% filter(time == 5) %>% mutate(surv_pct = round(surv * 100, 1)) # 情况2:如果time=5不在模型的时间点中,用插值计算(保持KM曲线阶梯特性) surv_prob_5 <- purrr::map_dfr(fit$strata, function(strat_data) { surv_interp <- approxfun( x = strat_data$time, y = strat_data$surv, method = "constant", f = 1 ) surv_val <- surv_interp(5) tibble( surg = names(strat_data), surv = surv_val, surv_pct = round(surv_val * 100, 1) ) })
2. 绘图并添加百分比标注
在原有绘图代码基础上,用geom_text将提取好的百分比文本定位到垂直线与生存曲线的交点位置:
fit %>% ggsurvfit(linewidth = 0.8) + add_censor_mark(size = 2, alpha = 0.2) + add_quantile(x_value = 5, color = "grey30", linewidth = 0.8) + # 添加百分比标注,调整位置避免与线条重叠 geom_text( data = surv_prob_5, aes(x = 5, y = surv, label = paste0(surv_pct, "%")), color = "grey30", vjust = -0.5, # 向上偏移文本 hjust = 0.5, size = 3.5 ) + scale_ggsurvfit()
说明
add_quantile仅负责绘制垂直线,不会自动标注对应y轴数值。通过提取/插值获取生存概率后,用geom_text完成标注,就能实现需求。
内容的提问来源于stack exchange,提问作者newbieTOggplot2
相关产品推荐
相关产品推荐

