0

Hi I would have a question. I am trying to draw 3 survival curve on the same plot. For each plot I would like to add the confident interval.

For this I have a data frame

          dput(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"))

I tried this. It works but it's not beautiful.

ya <- rownames(df)
xa <- Group1
z1a <- lowerA
z2a <- upperA


xb <- Group2
z1b <- lowerB
z2b <- upperB


xc <- Group3
z1c <- lowerC
z2c <- upperC
#
plot(ya, xa, ylim = c(0,40))
lines(ya, xa, c)
# now the confidence bands
lines(ya, z1a, lty = "dotted")
lines(ya, z2a, lty = "dotted")

lines(yb, xb, col="green")
# now the confidence bands
lines(yb, z1b, lty = "dotted",col="green")
lines(yb, z2b, lty = "dotted", col="green")

lines(yc, xc, col="red")
# now the confidence bands
lines(yc, z1c, lty = "dotted", col="red")
lines(yc, z2c, lty = "dotted", col="red")

Any help? Suggestion?

Best, Peter

Peter
  • 133
  • 1
  • 11

1 Answers1

1

You could do something like this:

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

colors <- c("blue","green","red")

library(scales)
plot(df$Group1, type = "n",ylim = c(0,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(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)
}

legend("topleft", legend = c("A","B","C"),
    col = c("blue","green","red"),
    lty = 1,
    bty = "n")

Edit: Note that the colors of the polygons are semitransparent, overlaps of confidence intervals remain visible. I changed a value in your example to illustrate this.

Edit 2: I added a legend and error bars Plot

tobiasegli_te
  • 1,413
  • 1
  • 12
  • 18
  • Hi tobiasegli_te, th is is exactly what I had with my initial script. I find it not that sexy and My point is how to get a nice figure. – Peter Nov 22 '17 at 09:15
  • I see, that was not clear to me from your question. I edited my answer accordingly. – tobiasegli_te Nov 22 '17 at 09:38
  • Dear tobiasegli_te. Unfortunally I can not reproduce your figure. There is an error message when I run the script. `Error in xy.coords(x, y) : 'x' and 'y' lengths differ`. Thank you – Peter Nov 22 '17 at 11:00
  • If you don't use exactly the same data as you have provided, you should use `polygon(x = c(1:nrow(df),nrow(df):1), ...)` this might solve the error – tobiasegli_te Nov 22 '17 at 11:09
  • Awesome! Thats perfect now ! The error message was not clear enough. I could run scales package without any error message. Thank you a bunch dear tobiasegli_te. Problem solved !!! Just need to add a proper legend. An extra question would be how would you add 95% confidence interval error bars to each value instead of the semitransparent polygons? Thanks again – Peter Nov 22 '17 at 11:10
  • There you go. I left the polygons in for completeness' sake. – tobiasegli_te Nov 22 '17 at 11:23
  • PERFECT ! Thanks a bunch again tobiasegli_te. ;) – Peter Nov 22 '17 at 11:33