survminer包的ggsurvplot()
函数可以画好看的生存分析曲线,也可以用分面的方法分面绘制多组图片(教程可以见我以前给生信助手上的一个小建议「凌云34」Multiple Overall Survival Plots(2),虽然说ggsurvplot()
的语法基于ggplot2(其实应该是ggpubr),但是它的图却不是标准的ggplot2格式,所以对于多个生存曲线图,你并不能使用 cowplot,ggarrange和patchwork进行拼接,甚至于Y叔开发的ggplotify都不能转换为ggplot图形(大家如有好的方案,也可以下方评论),那么到底要怎么办才行。
比如说有下面这种数据
event | grade | size | time |
---|---|---|---|
1 | 2 | small | 92 |
0 | 3 | big | 71 |
1 | 3 | small | 58 |
0 | 2 | small | 68 |
0 | 2 | big | 103 |
0 | 2 | small | 93 |
0 | 2 | small | 111 |
0 | 3 | small | 85 |
0 | 2 | small | 98 |
0 | 1 | small | 81 |
- 我们先按size分组,做一个生存曲线,得到下面这个图
library(survival)
library(survminer)
sfit <- survfit(Surv(time, event)~size, data=phe)
p1<-ggsurvplot(sfit,data = phe,
palette = 'jco',
conf.int = T,conf.int.style='step',
pval = T,pval.method = T,
risk.table = T,risk.table.pos='in',
legend=c(0.85,0.85),
legend.title="Size",
legend.labs=c("small","big"),
title="Survival curve for size",
ggtheme = theme_bw(base_size = 12))
p1
- 我们还可以按grade分组,得到下面这个图
gfit=survfit(Surv(time, event)~grade, data=phe)
p2<-ggsurvplot(gfit,data = phe,
palette = 'lancet',
conf.int = T,conf.int.style='step',
pval = T,pval.method = T,
risk.table = T,risk.table.pos='in',
legend=c(0.85,0.85),
legend.title="Grade",
title="Survival curve for grade",
ggtheme = theme_bw(base_size = 12)
)
p2
然而,我们并不能拼接图形,使用下面的经典拼图代码全都会报错,连转换为ggplot都做不到
cowplot::plot_grid(p1,p2) # 这个函数不行
patchwork::p1+p1 # 这个函数也不行
p1<-ggplotify::as.ggplot(p1) # 转成ggplot也不行
那么,除了导出图片,用AI等工具以外,是不是就没有在R里直接的解决方案了呢?
不然,我们可以用survminer的arrange_ggsurvplots
函数进行解决,如下面代码跑完,就可以得到拼图了。
splots <- list()
splots[[1]] <- p1
splots[[2]] <- p2
# 将多个图合并一起
arrange_ggsurvplots(splots, print = TRUE,
ncol = 2, nrow = 1) #定义行数和列数