ggsurvplot添加生存曲线末端标注后风险表错位问题
解决生存曲线与风险表对齐问题并添加末端生存百分比
问题分析
你尝试在生存曲线末端添加生存百分比时,直接修改my_plot$plot的坐标轴设置,破坏了ggsurvplot内置的布局对齐逻辑——因为ggsurvplot返回的是包含生存图、风险表的复合对象,单独修改子图的坐标范围会导致两者宽度匹配失效,最终出现生存图宽度小于风险表、边缘不对齐的情况(表现为生存图左右边缘与下方风险表无法对齐)。
修复方案
以下提供两种可行方法,既能添加末端生存百分比,又能保持生存图与风险表的布局对齐:
方法一:曲线末端直接添加文本标注(推荐)
无需修改坐标轴,直接在曲线终点位置标注百分比,避免破坏布局:
library(survival) library(survminer) library(ggplot2) fit <- survfit(Surv(time, status) ~ sex, data = lung) time_cutoff = 600 # 计算目标时间点的生存百分比 survs <- summary(fit, times = time_cutoff)$surv labels <- paste(round(survs*100), '%', sep='') # 提取曲线在目标时间点的坐标数据 plot_data <- fortify(fit) plot_data_cutoff <- subset(plot_data, time == time_cutoff) # 生成基础生存图,统一设置x轴范围 my_plot <- ggsurvplot(fit, data = lung, risk.table = TRUE, tables.height = 0.2, ggtheme = theme_bw(), xlim = c(0, time_cutoff) ) # 在曲线末端添加文本标注,扩展x轴空间避免文本被截断 my_plot$plot <- my_plot$plot + geom_text(data = plot_data_cutoff, aes(x = time, y = surv, label = labels), hjust = -0.2, vjust = 0.5, size = 4) + coord_cartesian(xlim = c(0, time_cutoff + 100), clip = 'off') my_plot
方法二:同步调整双坐标轴与风险表的范围
如果坚持使用双坐标轴,需要同步修改风险表的x轴范围,保证两者宽度一致:
library(survival) library(survminer) fit <- survfit(Surv(time, status) ~ sex, data = lung) time_cutoff = 600 survs <- summary(fit, times=time_cutoff)$surv labels <- paste(round(survs*100), '%', sep='') # 生成基础生存图 my_plot <- ggsurvplot(fit, data = lung, risk.table = TRUE, tables.height = 0.2, ggtheme = theme_bw() ) # 修改生存图的坐标轴设置 my_plot$plot <- my_plot$plot + coord_cartesian(ylim=c(0,1), xlim = c(0,time_cutoff), clip = 'on', expand=FALSE) + scale_y_continuous(name=NULL, sec.axis=sec_axis(~., name=NULL, breaks = survs, labels= labels)) # 同步调整风险表的x轴范围,确保与生存图宽度匹配 my_plot$table <- my_plot$table + coord_cartesian(xlim = c(0, time_cutoff), expand=FALSE) my_plot
关键提示
ggsurvplot的复合组件(生存图、风险表)需要统一调整参数才能保持布局对齐,不要单独修改子图的坐标设置。- 方法一的文本标注方式更符合生存分析可视化的常规规范,也不会引入双坐标轴的潜在兼容性问题。
内容的提问来源于stack exchange,提问作者Gordon Lemmon
相关产品推荐
相关产品推荐

