如何在R的累积发生率图中添加中位线并保留风险表/累积事件表
解决方案
问题原因
surv.median.line 参数是为生存曲线(y轴为生存概率)设计的,当通过 fun = function(x) 1-x 将曲线转换为累积发生率后,该参数的内部计算逻辑会冲突,导致报错。直接修改 myplot$plot 后单独输出,只会显示绘图部分,因为此时返回的是单个ggplot对象,而非包含风险表、累积事件表的ggsurvplot复合对象。
解决步骤
- 计算中位累积发生率对应的时间(即中位生存时间,因为累积发生率=1-生存概率,当累积发生率达0.5时,对应生存概率0.5)
- 修改ggsurvplot对象中的
plot元素,添加中位线 - 直接输出完整的ggsurvplot对象,即可同时保留绘图、风险表和累积事件表
完整代码
library(survival) library(survminer) # 拟合KM模型 km.fit <- survfit(Surv(rfstime, status) ~ 1, data = gbsg) # 计算中位生存时间(对应累积发生率0.5的时间点) median_time <- summary(km.fit)$table["median"] # 生成包含风险表和累积事件表的基础图 myplot <- ggsurvplot(km.fit, fun = function(x) 1-x, data = gbsg, censor = FALSE, conf.int = TRUE, risk.table = TRUE, cumevents = TRUE, ylab = "Cumulative Incidence") # 给plot部分添加中位线(水平+垂直) myplot$plot <- myplot$plot + geom_segment(aes(x = 0, xend = median_time, y = 0.5, yend = 0.5), linetype = "dashed", color = "darkred") + geom_segment(aes(x = median_time, xend = median_time, y = 0, yend = 0.5), linetype = "dashed", color = "darkred") # 输出完整图(含风险表和累积事件表) print(myplot)
说明
- 用
summary(km.fit)$table["median"]自动计算中位时间,避免硬编码数值,适配不同数据集 - 修改
myplot$plot后直接打印myplot,会保留ggsurvplot对象的复合结构,同时显示三个部分 - 可根据需求调整中位线的颜色、线型等参数
内容的提问来源于stack exchange,提问作者Dan W
相关产品推荐
相关产品推荐

