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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:53:28