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

