解决ggsurvplot生存曲线右侧标注时风险表文本截断问题(短标签)
解决ggsurvplot指定结束时间后风险表文本截断问题
问题说明
用ggsurvplot绘制生存曲线时,指定结束时间time_cutoff并在曲线末端添加标注后,风险表最右侧的数值(比如实际是20、21)会被截断,只显示开头的2、2。如果直接扩大x轴右侧范围,虽然风险表文本正常了,但生存曲线会延伸到超出time_cutoff的位置,而且末端标注和曲线对不齐。
解决方案
核心思路是给图表预留足够的右侧空间,但只显示到指定结束时间,同时关闭绘图区域的裁剪限制,配合调整边距确保内容完整显示。修改后的代码如下:
library(survival) library(survminer) library(patchwork) fit <- survfit(Surv(time, status) ~ sex, data = lung) # 初始化生存曲线绘图,预设刻度间隔方便后续对齐 my_plot <- ggsurvplot(fit, data = lung, risk.table = TRUE, tables.height = 0.2, ggtheme = theme_bw(), break.time.by = 250 ) time_cutoff <- 500 xticks <- c(0, 250, 500) survs <- summary(fit, times = time_cutoff)$surv labels <- paste(round(survs*100), '%', sep='') # 处理生存曲线:控制显示范围,预留空间,关闭裁剪 my_plot$plot <- my_plot$plot + coord_cartesian(ylim = c(0,1), xlim = c(-50, time_cutoff), clip = 'off') + scale_x_continuous(name = NULL, breaks = xticks, limits = c(-50, time_cutoff + 50)) + scale_y_continuous(name = NULL, sec.axis = sec_axis(~., name = NULL, breaks = survs, labels = labels)) + theme(plot.margin = margin(5.5, 20, 5.5, 5.5)) # 右侧留边避免标注被截 # 处理风险表:匹配曲线的x轴范围,确保数值完整显示 table_ylim <- ggplot_build(my_plot$table)$layout$panel_params[[1]]$y.range my_plot$table <- my_plot$table + coord_cartesian(ylim = table_ylim, xlim = c(-50, time_cutoff + 50), clip = 'off') + scale_x_continuous(name = NULL, breaks = xticks) + theme(plot.margin = margin(5.5, 20, 5.5, 5.5)) # 组合生存曲线和风险表 (my_plot$plot / my_plot$table) + plot_layout(heights = c(3,1))
关键修改点解释
生存曲线的x轴设置:
scale_x_continuous的limits参数设置为c(-50, time_cutoff + 50),给图表右侧预留足够空间显示风险表文本;- 用
coord_cartesian的xlim限制显示范围到time_cutoff,确保生存曲线只绘制到指定结束时间; clip='off'关闭绘图区域的裁剪,让曲线末端的标注不会被切掉。
风险表的对齐处理:
- 风险表的x轴范围和生存曲线保持一致,确保刻度和数值的位置对齐;
- 同样关闭裁剪并调整右侧边距,让最右侧的风险数值完整显示。
预设刻度间隔:初始化绘图时设置
break.time.by=250,让风险表的初始刻度和后续自定义的xticks匹配,减少对齐偏差。
内容的提问来源于Stack Exchange,提问作者Gordon Lemmon
相关产品推荐
相关产品推荐

