Search code examples
rplotsurvival-analysis

print text on my R plots


I am having a hard time to print text on my R plots.

I have 3 plots, and for each of them I would like to add a label (p-value). Then for each of the 5 values that allowed me to draw a curve, print the value on the graphic.

In fact I would like to make my figure looks like the following figure (see bellow).

Using my following script.

Any help? Thanks in advance, Best,

df <-  structure(list(lowerA = c(4.1, 4.6, 5.5, 4.7, 5), Group1 = c(4.8,5.4, 6.4, 5.5, 5.7), 
                      upperA = c(5.7, 6.3, 7.3, 6.3, 6.6), lowerB = c(6.2, 7.1, 8.7, 7.4, 8.2), 
                      Group2 = c(7.3, 8.3, 10, 8.6, 9.5), upperB = c(8.6, 9.6, 11.4, 9.9, 10.8), 
                      lowerC = c(18.3, 19.5, 24.3, 22.9, 25.5), Group3 = c(21.4, 22.5, 27.6, 26.3, 29), 
                      upperC = c(24.7, 25.8, 31, 29.8, 32.7)), 
                 .Names = c("lowerA", "Group1", "upperA", "lowerB","Group2", "upperB", "lowerC", "Group3", "upperC"), 
                 row.names = c("year1", "year2", "year3", "year4", "year5"), class = c("tbl_df", "tbl", "data.frame"))

class(df)
df <- as.data.frame(df)

#### Data Base

colnames(df) <- gsub("A","1",colnames(df))
colnames(df) <- gsub("B","2",colnames(df))
colnames(df) <- gsub("C","3",colnames(df))

colors <- c("#000099", "#CC0000", "#808080")
labels <- c("red line", "black line","black line")

#########
lablist<-as.vector(c("2010","2011","2012","2013","2014"))
axis(1, labels = FALSE)

#########

library(scales)
plot(df$Group1, type = "n",ylim = c(0,40),frame.plot = FALSE, main = "", xlab = "", ylab = "Survival at hospital discharge (%)",labels = FALSE)
axis(1, at=1:5, labels=c("2011-2012","2012-2013","2013-2014","2014-2015","2015-2016")) 
axis(2, at=c(0, 10, 20, 30, 40), labels=c("0","10","20","30","40")) 


for(i in 1:3){
  lines(df[,paste0("Group",i)], col = colors[i])

  polygon(x = c(1:nrow(df),nrow(df):1),
          y = c(df[,paste0("lower",i)],rev(df[,paste0("upper",i)])),
          col = alpha(c("white","white","white"), 0.1),
          # si tu veux garder les couleur des IC le long des courbes mets commande si après:
          # col = alpha(colors[i], 0.1),
          border = NA)

  arrows(x0 = c(1:nrow(df)),
         x1 = c(1:nrow(df)),
         y0 = df[,paste0("lower",i)],
         y1 = df[,paste0("upper",i)],
         col = colors[i],
         angle = 90,
         length = 0.05,
         code = 3)
}

enter image description here


Solution

  • Here's an example getting the point labels. I'll leave the P value labels as an exercise for the reader.

    plot(df$Group1, type = "n",ylim = c(0,40),frame.plot = FALSE, main = "", xlab = "", ylab = "Survival at hospital discharge (%)", axes = F)
    axis(1, at=1:5, labels=c("2011-2012","2012-2013","2013-2014","2014-2015","2015-2016")) 
    axis(2, at=c(0, 10, 20, 30, 40)) 
    
    for(i in 1:3){
      lines(df[,paste0("Group",i)], col = colors[i])
    
      arrows(x0 = c(1:nrow(df)),
             x1 = c(1:nrow(df)),
             y0 = df[,paste0("lower",i)],
             y1 = df[,paste0("upper",i)],
             col = colors[i],
             angle = 90,
             length = 0.05,
             code = 3)
    
      points(df[,paste0("Group",i)], col = "white", pch = 15, cex = 2)
      text(df[,paste0("Group",i)], labels = df[,paste0("Group",i)], col = colors[i], cex = 0.7)      
    }
    

    I set axes = F instead of labels = F in plot() to get rid of the warning, and I deleted the polygon code because it wasn't doing anything. You may want to further adjust the cex of the text and the points so it is sized nicely.

    enter image description here