41

I have the following data frame:

test2 <- data.frame(groups = c(rep("group1",4), rep("group2",4)), 
    X2 = c(rnorm(4), rnorm(4)) , 
    label = c(rep(1,2),rep(2,2),rep(1,2),rep(2,2)))

and I am plotting the bar graphs for each label per group using:

ggplot(test2, aes(label, X2, fill=as.factor(groups))) + 
    geom_bar(position="dodge", stat="identity")

enter image description here

However, I am cannot seem to be able to find a stat="mean" so I can plot the means on each bar graph instead of the identity.

Thanks for any help.

epo3
  • 2,991
  • 2
  • 33
  • 60
Cauchy
  • 1,677
  • 2
  • 21
  • 30
  • This tutorial provides a good description of how to achieve this: http://www.r-bloggers.com/using-r-barplot-with-ggplot2/ – seaotternerd May 12 '15 at 06:29
  • 2
    possible duplicate of [Plotting the average values for each level in ggplot2](http://stackoverflow.com/questions/11857935/plotting-the-average-values-for-each-level-in-ggplot2) – seaotternerd May 12 '15 at 06:32

3 Answers3

99

simply use stat = "summary" and fun.y = "mean"

ggplot(test2) + 
  geom_bar(aes(label, X2, fill = as.factor(groups)), 
           position = "dodge", stat = "summary", fun.y = "mean")

enter image description here

PatrickT
  • 10,037
  • 9
  • 76
  • 111
uhlitz
  • 1,472
  • 10
  • 8
6

ggplot2 likes 1 data point for 1 plot point. Create a new data frame with your summary statistics, then plot with stat="identity"

require(reshape2)
plot.data <- melt(tapply(test2$X2, test2$groups,mean), varnames="group", value.name="mean")

 ggplot(plot.data, aes(x=group,y=mean)) + geom_bar(position="dodge", stat="identity")

enter image description here

PatrickT
  • 10,037
  • 9
  • 76
  • 111
Scransom
  • 3,175
  • 3
  • 31
  • 51
1

Try using ggpubr. It creates ggplot2-like charts.

library(ggpubr)

ggbarplot(test2, x = "label", y = "X2",
          add = "mean", fill = "groups")

enter image description here

Alternatively, add a facet:

ggbarplot(test2, x = "label", y = "X2",
          add = "mean", fill = "groups",
          facet.by = "groups")

enter image description here

epo3
  • 2,991
  • 2
  • 33
  • 60