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

如何基于survfit对象提取的res数据框结合ggjoy绘制生存分析图?

使用ggjoy(或ggridges)结合生存分析数据框绘制图形

嘿,看起来你已经完成了生存分析的第一步——把survfit对象转换成了数据框res,接下来用ggjoy绘制相关图形其实很直接,不过有几个关键点要注意,我一步步给你说:

首先,先确认你的res数据框是否包含分组变量(比如你提到的sex)。从你给出的res结构来看,目前没有分组列,但你的km_sex是按性别分组的生存分析结果,所以如果是手动构造的res,记得把分组信息加进去;如果还没处理,推荐用broom包的tidy()函数来提取,它会自动保留分组:

library(broom)
# 从km_sex提取带分组信息的完整数据框
res <- tidy(km_sex)
# 此时res会有strata列,对应你的性别分组

用ggjoy绘制生存相关脊线图

ggjoy的核心是绘制脊线图(joyplot),适合展示不同组的变量随时间的分布趋势。针对生存分析,我们可以用它来展示不同性别组的生存概率、风险人数等指标的变化:

示例1:生存概率随时间的脊线图

library(ggjoy)
library(ggplot2)

# 绘制不同性别生存概率的脊线图
ggplot(res, aes(x = time, y = strata, height = estimate, group = strata)) +
  geom_joy(scale = 0.6, fill = "#2c7fb8", alpha = 0.7) +
  labs(
    x = "随访时间",
    y = "性别",
    title = "不同性别人群的生存概率变化脊线图",
    subtitle = "基于Kaplan-Meier分析结果"
  ) +
  theme_minimal()
  • x指定时间变量,y是分组(性别),height对应生存概率(estimate是tidy()提取的生存概率列,如果你手动构造的res是surv列,就替换成surv)
  • scale参数用来调整脊线的高度,避免不同组的图形重叠
  • alpha和fill可以自定义颜色和透明度,让图形更美观

示例2:风险人数随时间的脊线图

如果想展示不同组的风险人数变化,只需要把height换成n.risk即可:

ggplot(res, aes(x = time, y = strata, height = n.risk, group = strata)) +
  geom_joy(scale = 0.5, fill = "#fdae61", alpha = 0.7) +
  labs(
    x = "随访时间",
    y = "性别",
    title = "不同性别人群的风险人数变化脊线图"
  ) +
  theme_minimal()

注意:ggjoy已停止维护,推荐用ggridges

需要提醒你,ggjoy包已经不再更新维护了,现在更推荐使用它的替代包ggridges,功能更完善,用法也类似:

library(ggridges)

# 用ggridges绘制生存概率脊线图
ggplot(res, aes(x = time, y = strata, height = estimate)) +
  geom_ridgeline(fill = "#2c7fb8", alpha = 0.7, scale = 0.6) +
  labs(
    x = "随访时间",
    y = "性别",
    title = "不同性别人群的生存概率变化脊线图"
  ) +
  theme_minimal()

如果你的res是手动构造的,记得确认所有列的完整性(比如你给出的upper列后面是...,要确保数据没有缺失,否则绘图会报错)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:05:44