如何调整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
相关产品推荐
相关产品推荐

