3

That's my data:

dput(dt)
structure(c(15236000, 0, 0, 0, 0, 36722900, 45971100, 0, 0, 0, 
            0, 99067800, 91416000, 0, 0, 0, 0, 219396000, 230630600, 0, 0, 
            0, 0, 254380400, 354388700, 0, 0, 0, 0, 438443760, 462991400, 
            0, 0, 0, 0, 497156100, 235045400, 0, 0, 0, 0, 290932300, 168440600, 
            0, 0, 0, 0, 196797700, 362305500, 0, 0, 0, 0, 375372400, 1367158670, 
            0, 0, 0, 0, 1122186600, 978435120, 0, 0, 0, 0, 983735500, 2104276960, 
            0, 0, 0, 0, 2220253960, 1267607300, 0, 0, 0, 0, 1323143500, 1080187900, 
            0, 0, 0, 0, 1410693500, 840738200, 0, 0, 0, 0, 1226346700, 1139340100, 
            0, 0, 0, 0, 1758611700, 2425368000, 0, 0, 0, 0, 3150723500, 3141234200, 
            0, 0, 0, 0, 4124976700, 2880830100, 0, 0, 0, 0, 4403308600, 2923459800, 
            0, 0, 0, 0, 4360192600), .Dim = c(3L, 40L), .Dimnames = list(
              NULL, c("10", "10", "34", "34", "59", "59", "84", "84", "110", 
                      "110", "134", "134", "165", "165", "199", "199", "234", "234", 
                      "257", "257", "362", "362", "433", "433", "506", "506", "581", 
                      "581", "652", "652", "733", "733", "818", "818", "896", "896", 
                      "972", "972", "1039", "1039")))

That's the code which I use for generating my barplot:

n <- barplot(dt, axisnames = FALSE, las=1, offset = 0.1, col=c("gold1", "grey", "darkgray"), space=c(0, rep(c(0,0.5), (ncol(dt)-2)/2), 0),
             ylim = c(0,5e9))
axis(1, at=(n[-length(n)] + diff(n)/2)[c(TRUE, FALSE)], labels = unique(colnames(dt)), lwd = 0)
legend("topleft",legend = c("Peter","Mark") , col=c("gold1", "darkgray"), pch=15)

Last, the vector of pvalues and I would like to use 0.05 as a cutoff:

dput(vec_sign)
structure(c(0.26568675227896, 0.231295165962475, 0.146062122767301, 
            0.0187166701304913, 0.266800697199367, 0.566155201859571, 0.209901856029658, 
            0.364700152093356, 0.60914593877063, 0.335501894803805, 0.857979911768549, 
            0.201770045767981, 0.247547900482962, 0.0238847396218355, 0.00166753510687916, 
            2.33535556849617e-05, 0.0803932103358651, 0.181860618123498, 
            0.000584951559321768, 0.000349070394928198), .Names = c("10", 
                                                                    "34", "59", "84", "110", "134", "165", "199", "234", "257", "362", 
                                                                    "433", "506", "581", "652", "733", "818", "896", "972", "1039"
            ))


vec_sign <  0.05

I would like to have nice asterisks above specific bars in my barplot which will be indicated by TRUE when you apply last piece of presented code.

d.b
  • 32,245
  • 6
  • 36
  • 77
Shaxi Liver
  • 1,052
  • 3
  • 25
  • 47
  • 2
    Possible duplicate of [Put stars on ggplot barplots and boxplots - to indicate the level of significance (p-value)](https://stackoverflow.com/questions/17084566/put-stars-on-ggplot-barplots-and-boxplots-to-indicate-the-level-of-significanc) – S Rivero Dec 13 '17 at 15:09
  • @SRivero, that's a ggplot question while this is base. So I don't believe it to be a duplicate. – Axeman Dec 13 '17 at 15:21

2 Answers2

4
test <-vec_sign <  0.05
seqeven<-seq(from=1,to=length(n)-1,by=2)
seqodd<-seq(from=2,to=length(n),by=2)
y=pmax(dt[1,seqeven],dt[3,seqodd])[test]+1e8
x=n[seqeven][test]+0.5
text(x,y,"*")

enter image description here

Cedric
  • 2,412
  • 17
  • 31
2

Here is one approach:

xpos <- seq(1, 48.5, by = 2.5)
for(i in seq_along(vec_sign)) {
  ypos <- max(dt[, c(2*i-1, 2*i)]) * 1.05
  if(vec_sign[i] <= 0.05) text(x = xpos[i], y = ypos, "*")
}
Martin Schmelzer
  • 23,283
  • 6
  • 73
  • 98