如何封装ggfortify绘制生存曲线的代码(分离数据框与列参数)
我来帮你把这个生存曲线绘制的逻辑封装成一个易用的自定义函数,这样你不用每次都重复写那些繁琐的代码啦!
自定义生存曲线绘制函数实现
下面这个函数兼容你提到的两种调用方式,还加了包依赖检查,避免因为没装包报错:
# 自定义生存曲线绘制函数 plot_survival_curve <- function(time_var, status_var, group_var, data = NULL) { # 检查并提示安装所需包 if (!requireNamespace("survival", quietly = TRUE)) { stop("需要先安装survival包,请运行:install.packages('survival')") } if (!requireNamespace("ggfortify", quietly = TRUE)) { stop("需要先安装ggfortify包,请运行:install.packages('ggfortify')") } # 处理两种数据传入模式 if (is.null(data)) { # 模式1:直接传入变量向量(比如 ovarian$futime 这类形式) surv_obj <- survival::survfit(survival::Surv(time_var, status_var) ~ group_var) } else { # 模式2:传入数据框+列名(支持裸变量名或字符串) # 用rlang处理非标准求值,兼容两种列名传入方式 time_var <- rlang::ensym(time_var) status_var <- rlang::ensym(status_var) group_var <- rlang::ensym(group_var) surv_obj <- survival::survfit( survival::Surv(!!time_var, !!status_var) ~ !!group_var, data = data ) } # 生成并返回ggplot格式的生存曲线 p <- ggfortify::autoplot(surv_obj) return(p) }
参数说明
time_var:生存时间变量,可以是直接的向量(比如ovarian$futime),或者数据框中的列名(配合data参数使用)status_var:结局状态变量(通常0代表截尾,1代表事件发生),传入规则同上group_var:分组变量,用来区分不同组的生存曲线,传入规则同上data:可选参数,当你传入列名而非向量时,指定对应的数据集
用法示例
示例1:对应原方式1(直接传变量向量)
# 先加载所需包(函数里会检查,但提前加载也没问题) library(survival) library(ggfortify) # 调用函数,直接传入ovarian的列向量 curve1 <- plot_survival_curve( time_var = ovarian$futime, status_var = ovarian$fustat, group_var = ovarian$resid.ds ) # 展示图形 print(curve1)
示例2:对应原方式2(分离数据框与列名)
# 调用函数,指定data参数,传入列名 curve2 <- plot_survival_curve( time_var = futime, status_var = fustat, group_var = resid.ds, data = ovarian ) # 展示图形 print(curve2)
额外扩展:修改图形样式
因为函数返回的是标准ggplot对象,你可以用ggplot的语法随意调整样式,比如加标题、修改坐标轴标签:
curve2 + ggplot2::ggtitle("卵巢癌患者按残留病灶分组的生存曲线") + ggplot2::xlab("生存时间(天)") + ggplot2::ylab("累积生存率") + ggplot2::theme_minimal()
内容的提问来源于stack exchange,提问作者Venca
相关产品推荐
相关产品推荐

