Switch to unified view

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
}