如何在survminer::ggsurvplot的KM图右上角添加自定义统计表格?
在KM生存曲线右上角添加自定义统计表格(保留风险表)
实现思路
借助patchwork工具将自定义统计表格嵌入KM主图右上角,再将带表格的主图与风险表垂直拼接,既保留原有风险表,又添加指定的统计信息表格。
完整代码
library(survival) library(lubridate) library(ggsurvfit) library(gtsummary) library(tidycmprsk) library(condsurv) library(broom) library(dplyr) library(ggplot2) library(patchwork) # 1. 计算生存统计量 km <- survfit(Surv(time, status) ~ sex, data = lung) hr <- coxph(Surv(time, status) ~ sex, data = lung) # 提取中位生存期及95%CI median_stats <- broom::tidy(km, conf.int = TRUE) %>% dplyr::select(strata, estimate, conf.low, conf.high) %>% dplyr::mutate( median_survival = paste0(round(estimate, 1), " (", round(conf.low, 1), "-", round(conf.high, 1), ")") ) %>% dplyr::select(strata, median_survival) # 提取HR、95%CI和p值 hr_stats <- broom::tidy(hr, exponentiate = TRUE, conf.int = TRUE) %>% dplyr::mutate( hr_ci = paste0(round(estimate, 2), " (", round(conf.low, 2), "-", round(conf.high, 2), ")"), p_value = format.pval(p.value, digits = 2, eps = 0.001) ) %>% dplyr::select(term, hr_ci, p_value) # 2. 创建自定义统计表格(模拟目标样式) table_data <- data.frame( Metric = c("中位生存期 (95% CI)", "HR (95% CI)", "P值"), Value = c( median_stats$median_survival[2], # 对应sex=2的组,可按需调整 hr_stats$hr_ci[1], hr_stats$p_value[1] ) ) custom_table <- ggplot(table_data, aes(x = 1, y = Metric)) + geom_text(aes(label = Metric), hjust = 1, size = 3.5, color = "black") + geom_text(aes(label = Value), hjust = 0, size = 3.5, color = "black") + theme_void() + theme( plot.margin = margin(4, 4, 4, 4), plot.background = element_rect(fill = "white", color = "black", linewidth = 0.5) ) + xlim(0, 2) # 调整表格宽度,适配主图 # 3. 绘制基础KM图并组合元素 p <- ggsurvplot(km, risk.table = TRUE, risk.table.col = c('sex'), risk.table.height = 0.25, xlab = 'Time', break.time.by = 20, risk.table.y.text = FALSE, risk.table.y.text.col = TRUE, risk.table.title="Number at risk", ggtheme = theme_classic()) # 提取主图和风险表,嵌入自定义表格后拼接 main_plot_with_table <- p$plot + inset_element(custom_table, left = 0.68, bottom = 0.72, right = 0.97, top = 0.97) final_plot <- main_plot_with_table / p$table + plot_layout(heights = c(3, 1)) # 展示最终图形 final_plot
关键说明
- 统计量提取:用
broom包将survfit和coxph的结果转为 tidy 格式,方便整理成表格数据 - 自定义表格:用
ggplot2绘制无坐标轴的极简表格,通过theme_void()去除多余元素,调整边框和间距匹配目标样式 - 元素组合:
patchwork的inset_element可精准控制表格在主图中的位置,plot_layout调整主图与风险表的高度比例
内容的提问来源于stack exchange,提问作者user2272972
相关产品推荐
相关产品推荐

