|
a |
|
b/function/get_survival_plot.R |
|
|
1 |
getsurvplot <- function(feature,feature_name,df,labs=c("ctDNA Negative","ctDNA Positive")){ |
|
|
2 |
s_fit = as.formula(paste0('Surv(DFS,DFS_status)~', feature)) |
|
|
3 |
fit = surv_fit(s_fit,data=df) |
|
|
4 |
p = ggsurvplot(fit, risk.table = TRUE,legend.labs=labs,risk.table.title = "No. at risk", |
|
|
5 |
palette = c("#003B63","#9E333E"),legend = 'none', |
|
|
6 |
title=feature_name,xlab="Days from surgery",ylab="Recurrence-free Survival", |
|
|
7 |
conf.int= F,break.time.by = 90,axes.offset=F,fontsize = 5, |
|
|
8 |
tables.theme = theme_cleantable(base_family= 'Arial'), |
|
|
9 |
risk.table.height = 0.2,censor.size=2, size = 0.3, |
|
|
10 |
ggtheme = theme( |
|
|
11 |
axis.text = element_text(size=12), |
|
|
12 |
panel.background = element_rect(fill = "white"), |
|
|
13 |
plot.title = element_text(hjust = 0.5), |
|
|
14 |
plot.background = element_blank(), |
|
|
15 |
axis.line = element_line(colour = "black"), |
|
|
16 |
axis.title = element_text(size=14,face = 'bold', family="sans"), |
|
|
17 |
legend.text = element_text(size=14, family="sans"), |
|
|
18 |
legend.title = element_text(size=14, family="sans"), |
|
|
19 |
title = element_text(size=14,face = 'bold', family="sans"), |
|
|
20 |
# panel.grid.major.y = element_line(colour = "grey"), |
|
|
21 |
#panel.grid.minor.y = element_line(colour = "darkgrey") |
|
|
22 |
)) |
|
|
23 |
res<-coxph(s_fit,data=df) |
|
|
24 |
pval = summary(res)$logtest[3] |
|
|
25 |
if (pval<0.0001){ |
|
|
26 |
pcut = "P < .0001" |
|
|
27 |
}else if (pval<0.001){ |
|
|
28 |
pcut = "P < .001" |
|
|
29 |
}else if(pval<0.01){ |
|
|
30 |
pcut = "P < .01" |
|
|
31 |
}else if(pval<0.05){ |
|
|
32 |
pcut= "P < .05" |
|
|
33 |
}else{ |
|
|
34 |
pcut= paste0("P = ",round(pval,2)) |
|
|
35 |
} |
|
|
36 |
p$plot = p$plot+ |
|
|
37 |
ggplot2::annotate("text",x = 30, y = 0.10,size=5,hjust = 0, |
|
|
38 |
label = paste0("Log-rank ",pcut, |
|
|
39 |
"\n", |
|
|
40 |
"HR: ",round(summary(res)$conf.int[1],2)," (", |
|
|
41 |
"95%CI: ",round(summary(res)$conf.int[3],2),"-", |
|
|
42 |
round(summary(res)$conf.int[4],2),")" |
|
|
43 |
) |
|
|
44 |
) |
|
|
45 |
p$table <- p$table + theme(panel.grid.major.y = element_blank(),axis.text.y = element_text(hjust=0,size=14, family="sans"), |
|
|
46 |
plot.title = element_text(hjust = 0,size=14,face = 'bold', family="sans"), |
|
|
47 |
text = element_text(size=12, family="sans") |
|
|
48 |
) |
|
|
49 |
return(p) |
|
|
50 |
} |
|
|
51 |
|
|
|
52 |
getATplot = function(title,AT_df){ |
|
|
53 |
res_pos = summary(coxph(Surv(DFS,DFS_status)~AdjuvantTherapy_status, |
|
|
54 |
subset(AT_df, P2_stat=="Pos"&PathologicStage %in% c("IIA","IIB","IIIA","IIIB")))) |
|
|
55 |
pval_pos = res_pos$sctest[3] |
|
|
56 |
|
|
|
57 |
res_neg = summary(coxph(Surv(DFS,DFS_status)~AdjuvantTherapy_status, |
|
|
58 |
subset(AT_df, P2_stat=="Neg"&PathologicStage %in% c("IIA","IIB","IIIA","IIIB")))) |
|
|
59 |
pval_neg = res_neg$sctest[3] |
|
|
60 |
|
|
|
61 |
res_ACT = summary(coxph(Surv(DFS,DFS_status)~P2_stat, |
|
|
62 |
subset(AT_df, AdjuvantTherapy_status==1&PathologicStage %in% c("IIA","IIB","IIIA","IIIB")))) |
|
|
63 |
pval_ACT = res_ACT$sctest[3] |
|
|
64 |
|
|
|
65 |
res_nonACT = summary(coxph(Surv(DFS,DFS_status)~P2_stat, |
|
|
66 |
subset(AT_df, AdjuvantTherapy_status==0&PathologicStage %in% c("IIA","IIB","IIIA","IIIB")))) |
|
|
67 |
pval_nonACT = res_nonACT$sctest[3] |
|
|
68 |
|
|
|
69 |
transp = function(pval){ |
|
|
70 |
if (pval<0.0001){ |
|
|
71 |
pcut = "p < .0001" |
|
|
72 |
}else if (pval<0.001){ |
|
|
73 |
pcut = "p < .001" |
|
|
74 |
}else if(pval<0.01){ |
|
|
75 |
pcut = "p < .01" |
|
|
76 |
}else if(pval<0.05){ |
|
|
77 |
pcut= "p < .05" |
|
|
78 |
}else{ |
|
|
79 |
pcut= paste0("p = ",round(pval,2)) |
|
|
80 |
} |
|
|
81 |
return(pcut) |
|
|
82 |
} |
|
|
83 |
p = ggsurvplot(survfit(Surv(DFS,DFS_status)~Postsurgical_detection+AdjuvantTherapy_status, |
|
|
84 |
subset(AT_df, PathologicStage %in% c("IIA","IIB","IIIA","IIIB"))), |
|
|
85 |
risk.table = TRUE,legend = 'none',risk.table.title = "No. at risk", |
|
|
86 |
legend.labs=c("no neg","yes neg", |
|
|
87 |
"no pos","yes pos"), |
|
|
88 |
palette = c("cornflowerblue","green","brown4","darkorange2"), |
|
|
89 |
xlab="Days from surgery",ylab="Recurrence-free Survival", |
|
|
90 |
conf.int= F,break.time.by = 90,axes.offset=F,fontsize = 4,censor.size=2, size = 0.5, |
|
|
91 |
tables.theme = theme_cleantable(base_family= 'Courier'), |
|
|
92 |
risk.table.height = 0.3,title =title, |
|
|
93 |
ggtheme = theme( |
|
|
94 |
axis.text = element_text(size=12), |
|
|
95 |
panel.background = element_rect(fill = "white"), |
|
|
96 |
plot.title = element_text(hjust = 0.5), |
|
|
97 |
plot.background = element_blank(), |
|
|
98 |
axis.line = element_line(colour = "black"), |
|
|
99 |
axis.title = element_text(size=14,face = 'bold'), |
|
|
100 |
legend.text = element_text(size=14), |
|
|
101 |
legend.title = element_text(size=14), |
|
|
102 |
title = element_text(size=14,face = 'bold'), |
|
|
103 |
# panel.grid.major.y = element_line(colour = "grey"), |
|
|
104 |
#panel.grid.minor.y = element_line(colour = "darkgrey") |
|
|
105 |
)) |
|
|
106 |
|
|
|
107 |
|
|
|
108 |
p$plot = p$plot+ |
|
|
109 |
ggplot2::annotate("text",x = 10, y = 0.10,size=5,hjust = 0,vjust=0, |
|
|
110 |
label = paste0( |
|
|
111 |
"ACT patients, ctDNA pos vs neg: ",transp(pval_ACT) ,"; ", |
|
|
112 |
"non-ACT patients, ctDNA pos vs neg: ",transp(pval_nonACT) ,"\n", |
|
|
113 |
"ctDNA negative, ACT vs non-ACT: ",transp(pval_neg) ,"; ", |
|
|
114 |
"ctDNA positive, ACT vs non-ACT: ",transp(pval_pos) |
|
|
115 |
|
|
|
116 |
) |
|
|
117 |
) |
|
|
118 |
p$table <- p$table + theme(panel.grid.major.y = element_blank(),axis.text.y = element_text(hjust=0,size=14), |
|
|
119 |
plot.title = element_text(hjust = 0,size=10,face = 'bold'), |
|
|
120 |
text = element_text(size=10) |
|
|
121 |
) |
|
|
122 |
p |
|
|
123 |
} |