Home > Software design >  plot the mean on barplot without overlaping geom_text
plot the mean on barplot without overlaping geom_text

Time:11-30

Very simple question. I'm trying to add the means to each variable on the barplot below. Problem is: I'm not able to do that, whenever I try I get the single value for mean(varUnlist) or image

  • code:
myData %>% 
  ggplot(aes(varUnlist, type, fill = type))        # ggplot2 barplot with error bars
  coord_flip()  
  geom_bar(stat = "summary", fun.data = mean_se,  width = 0.2)      
  stat_summary(geom = "errorbar", fun.data = mean_se, position = "dodge", width = 0.2)   
  scale_fill_brewer(palette = "Blues", name = 'type:')  
  geom_text(label = str_glue('{mean(myData$varUnlist)}'), check_overlap = TRUE)  
  labs(x = "x",
       y = "median of Y",
       title = str_glue("effect of X on Y"))  
  theme_bw()  
  theme(legend.position = "right",
        legend.background = element_rect(color = "black"),  #bloco com legendas
        legend.margin = margin(5, 5, 3, 3),
        axis.text.x = element_text(angle = 0, hjust = 0.5, face = "bold"), # legenda de baixo: axis.text.x = element_text(angle = 0, hjust = 0.5, face = "bold"), axis.text.x = element_blank(),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        axis.text.y = element_text(face = "bold"))
  • data:
> dput(myData)
structure(list(varUnlist = c(Outcome1 = 6.3, Outcome2 = 5.4, 
Outcome3 = 7.6, Outcome4 = 8.6, Outcome5 = 8.1, Outcome6 = 8.2, 
Outcome7 = 8.3, Outcome8 = 9.1, Outcome9 = 8.7, Outcome10 = 6.8, 
Outcome11 = 5.7, Outcome12 = 7, Outcome13 = 8.5, Outcome14 = 7.6, 
Outcome15 = 8.2, Outcome16 = 8.3, Outcome17 = 9.1, Outcome18 = 7.8, 
Outcome19 = 7.8, Outcome20 = 7.4, Outcome21 = 8.3, Outcome22 = 9.1, 
Outcome23 = 8.4, Outcome24 = 8.8, Outcome25 = 5.6, Outcome26 = 8.2, 
Outcome27 = 7.3, Outcome28 = 9.2, Outcome29 = 9.2, Outcome30 = 8.8, 
Outcome31 = 8, Outcome32 = 8.3, Outcome33 = 7.8, Outcome34 = 7.8, 
Outcome35 = 6.4, Outcome36 = 5.6, Outcome37 = 8, Outcome38 = 7.2, 
Outcome39 = 6.8, Outcome40 = 8.2, Outcome41 = 8, Outcome42 = 9.1, 
Outcome43 = 5.3, Outcome44 = 6.6, Outcome45 = 7.4, Outcome46 = 4.6, 
Outcome47 = 5.1, Outcome48 = 5.8, Outcome49 = 7.6, Outcome50 = 6.7, 
Outcome51 = 7.2, Outcome52 = 6.8, Outcome53 = 6, Outcome54 = 5.8, 
Outcome55 = 8.1, Outcome56 = 8.7, Outcome57 = 8.3, Outcome58 = 7, 
Outcome59 = 7.4, Outcome60 = 7.6, Outcome61 = 6.2, Outcome62 = 5.7, 
Outcome63 = 7.1, Outcome64 = 6.6, Outcome65 = 7.5, Outcome66 = 7.1, 
Outcome67 = 7.7, Outcome68 = 8.3, Outcome69 = 7.2, Outcome70 = 8, 
Outcome71 = 8.8, Outcome72 = 8.3, Outcome73 = 7.5, Outcome74 = 8.3, 
Outcome75 = 6.4, Outcome76 = 5.4, Outcome77 = 5.8, Outcome78 = 6.5, 
Outcome79 = 7.6, Outcome80 = 8.6, Outcome81 = 7.8, Outcome82 = 4, 
Outcome83 = 4.8, Outcome84 = 5.2, Outcome85 = 6.8, Outcome86 = 7.5, 
Outcome87 = 6.1, Outcome88 = 7.1, Outcome89 = 8, Outcome90 = 8.4, 
Outcome91 = 7.2, Outcome92 = 9, Outcome93 = 8.2, Outcome94 = 7.6, 
Outcome95 = 8.2, Outcome96 = 7.2, Outcome97 = 7.6, Outcome98 = 9.1, 
Outcome99 = 8, Outcome100 = 7.8, Outcome101 = 8.5, Outcome102 = 7, 
Outcome103 = 8, Outcome104 = 7.5, Outcome105 = 8.7, Outcome106 = 9.2, 
Outcome107 = 8.7, Outcome108 = 9.1, Outcome109 = 5.8, Outcome110 = 6.5, 
Outcome111 = 7.4, Outcome112 = 8, Outcome113 = 7.8, Outcome114 = 6.5, 
Outcome115 = 7.8, Outcome116 = 8.2, Outcome117 = 7.2, Outcome118 = 8.8, 
Outcome119 = 7.9, Outcome120 = 7.6, Outcome121 = 6.5, Outcome122 = 7.2, 
Outcome123 = 5.7, Outcome124 = 8.7, Outcome125 = 8.1, Outcome126 = 7.8, 
Outcome127 = 6.3, Outcome128 = 5.2, Outcome129 = 7.8, Outcome130 = 6.6, 
Outcome131 = 7.2, Outcome132 = 5.8, Outcome133 = 8, Outcome134 = 7.1, 
Outcome135 = 7.4, Outcome136 = 6, Outcome137 = 7.2, Outcome138 = 5, 
Outcome139 = 8, Outcome140 = 7.6, Outcome141 = 7.2, Outcome142 = 5.3, 
Outcome143 = 5, Outcome144 = 6, Outcome145 = 9, Outcome146 = 8.8, 
Outcome147 = 8.5, Outcome148 = 4.8, Outcome149 = 5.2, Outcome150 = 6, 
Outcome151 = 8.6, Outcome152 = 9, Outcome153 = 8, Outcome154 = 7.6, 
Outcome155 = 8, Outcome156 = 7.2, Outcome157 = 7.4, Outcome158 = 8.3, 
Outcome159 = 7, Outcome160 = 7.6, Outcome161 = 5.2, Outcome162 = 6.4, 
Outcome163 = 5.8, Outcome164 = 7.4, Outcome165 = 6.6, Outcome166 = 5.5, 
Outcome167 = 5, Outcome168 = 5, Outcome169 = 5, Outcome170 = 5.3, 
Outcome171 = 5.5, Outcome172 = 8.2, Outcome173 = 8.4, Outcome174 = 8.8, 
Outcome175 = 5.6, Outcome176 = 5.2, Outcome177 = 6.4, Outcome178 = 4.6, 
Outcome179 = 4.8, Outcome180 = 4, Outcome181 = 6.2, Outcome182 = 5.8, 
Outcome183 = 5.6, Outcome184 = 6, Outcome185 = 6.8, Outcome186 = 5.8, 
Outcome187 = 6.6, Outcome188 = 7.6, Outcome189 = 7.2), type = structure(c(1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("A", 
"B", "C"), class = "factor")), row.names = c(NA, -189L), class = c("tbl_df", 
"tbl", "data.frame"))

CodePudding user response:

You'll probably have an easier time if you do your summarising prior to your plotting. Then you can just name variables directly for your aesthetics instead of calculating 'on the fly'.

Presently your geom_text() is inheriting the x and y aesthetics of your data, which has multiple values for y that you've summarised whilst plotting.

I would instead do something like this:

library(dplyr)
library(ggplot2)
library(tidyr)

summarised <- 
  myData |> 
  group_by(type) |> 
  summarise(mean_se(varUnlist))

summarised
#> # A tibble: 3 × 5
#>   type      y  ymin  ymax
#>   <fct> <dbl> <dbl> <dbl>
#> 1 A      7.12  6.96  7.28
#> 2 B      7.28  7.11  7.45
#> 3 C      7.14  6.99  7.28

ggplot(summarised, aes(x = type, y = y, fill = type))   
  geom_bar(stat = "identity",)   
  geom_errorbar(aes(ymin = ymin, ymax = ymax))   
  scale_fill_brewer()  
  geom_text(
    aes(label = round(y, 3)),
    nudge_y = 0.5) # so the labels don't hit the tops of the bars

Created on 2022-11-29 with reprex v2.0.2

  • Related