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

如何调整ggsurvplot中风险表的strata标签至风险数上方?

问题

风险表的strata标签过长,导致“No. at risk”区域右移,标签不再左对齐,与图表X轴错位。询问是否可将strata标签重新定位到风险人数的上方?

代码示例

library(survminer)
library(survival)
library(dplyr)

lung <- lung %>% 
  mutate(timeyr = time / 365.25)

fit <- survfit(Surv(timeyr, status) ~ sex, data = lung)

ggsurv <- ggsurvplot(fit,  size = 1,  
                     xlab = "随访时间(年)",
                     ylab = "生存概率(%)",
                     legend.labs = c("药物 1234234", "药物 25324"), 
                     linetype = "strata", 
                     xlim = c(0,2),
                     break.time.by = 1, 
                     palette = c("#E7B800", "#2E9FDF"), 
                     conf.int = FALSE, 
                     pval = FALSE, 
                     censor = FALSE,
                     risk.table = TRUE,
                     risk.table.title = "风险人数",
                     risk.table.height = 0.2,
                     fontsize = 6,
                     tables.theme = theme_cleantable()
)
ggsurv

问题图示

风险表标签错位示意图

解决方案

方法1:利用内置参数配合主题调整

通过设置risk.table.y.text相关参数隐藏原Y轴标签,再将标签添加为风险人数的表头:

ggsurv <- ggsurvplot(fit,  size = 1,  
                     xlab = "随访时间(年)",
                     ylab = "生存概率(%)",
                     legend.labs = c("药物 1234234", "药物 25324"), 
                     linetype = "strata", 
                     xlim = c(0,2),
                     break.time.by = 1, 
                     palette = c("#E7B800", "#2E9FDF"), 
                     conf.int = FALSE, 
                     pval = FALSE, 
                     censor = FALSE,
                     risk.table = TRUE,
                     risk.table.title = "风险人数",
                     risk.table.height = 0.2,
                     fontsize = 6,
                     # 隐藏原Y轴的标签文本
                     risk.table.y.text = FALSE,
                     tables.theme = theme_cleantable() +
                       theme(
                         # 调整表格布局,为上方标签留出空间
                         plot.margin = margin(t = 20, r = 10, b = 10, l = 10)
                       )
)

# 在风险表上方添加strata标签
ggsurv$table <- ggsurv$table +
  annotate("text", x = c(0, 0), y = c(1.2, 0.6), 
           label = c("药物 1234234", "药物 25324"), 
           size = 2.5, hjust = 0)

ggsurv

方法2:自定义调整风险表元素

直接修改风险表的绘图元素,移除原标签并在指定位置添加新标签:

# 生成原始生存图及风险表
ggsurv <- ggsurvplot(fit,  size = 1,  
                     xlab = "随访时间(年)",
                     ylab = "生存概率(%)",
                     legend.labs = c("药物 1234234", "药物 25324"), 
                     linetype = "strata", 
                     xlim = c(0,2),
                     break.time.by = 1, 
                     palette = c("#E7B800", "#2E9FDF"), 
                     conf.int = FALSE, 
                     pval = FALSE, 
                     censor = FALSE,
                     risk.table = TRUE,
                     risk.table.title = "风险人数",
                     risk.table.height = 0.2,
                     fontsize = 6,
                     tables.theme = theme_cleantable()
)

# 移除风险表原有的Y轴标签
ggsurv$table <- ggsurv$table + theme(axis.text.y = element_blank())

# 在风险人数上方添加自定义标签
ggsurv$table <- ggsurv$table +
  geom_text(data = data.frame(x = 0, y = c(1.1, 0.55), label = c("药物 1234234", "药物 25324")),
            aes(x = x, y = y, label = label), hjust = 0, size = 2.5)

# 调整Y轴范围,避免标签被截断
ggsurv$table <- ggsurv$table + ylim(0, 1.3)

ggsurv

效果说明

两种方法都能解决标签过长导致的错位问题,将strata标签移至风险人数上方。方法1更贴合survminer的内置逻辑,代码更简洁;方法2自由度更高,适合需要精细调整布局的场景。

内容的提问来源于stack exchange,提问作者geek45

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:39:51