0

I am facing a problem adding error bars to my plots. I have a data frame like this:

> str(bank1)
'data.frame':   24 obs. of  4 variables:
 $ site    : Factor w/ 12 levels "BED","BEU","EB",..: 8 9 10 3 11 1 6 7 5 4 ...
 $ canopy  : Factor w/ 3 levels "M_Closed","M_Open",..: 3 3 3 3 2 2 2 2 1 1 ...
 $ variable: Factor w/ 2 levels "depth5","depth10": 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : int  200 319 103 437 33 51 165 38 26 29 ...

I plot it like this:

gs1 <- ggplot(bank1, aes(x = canopy, y= value , fill = variable)) + 
  geom_bar(stat='identity', position = 'dodge', fill = 'darkgray')+
  xlab("Canopy cover")+ylab("Seed Bank")+ 
  facet_wrap(~variable,nrow=1)
gs1  

This gives a plot like this:
enter image description here

My problem is when I want to add the error bars (standard deviation), the code does not run. I use this code:

bank2 <- bank1
bank2.mean = ddply(bank2, .(canopy, variable), summarize,
                  plant.mean = mean(value), plant.sd = sd(value))

gs1 <- ggplot(bank1, aes(x = canopy, y= value , fill = variable)) + 
  geom_bar(stat='identity', position = 'dodge', fill = 'darkgray')+ 
  geom_errorbar(aes(ymin=plant.mean-plant.sd, ymax = plant.mean +
                      plant.sd), width = 0.5)+
  xlab("Canopy cover")+ylab("Seed Bank")+ 
  facet_wrap(~variable,nrow=1)
gs1  

I searched for help here, here, here and here but I did not understand how to proceed. Kindly help!

Here I reproduce an example:

> set.seed(1)
> Data1 <- data.frame(
+   site= c("KOA","KOB","KOO","EB","PNS","BED","KB","KER","KAU","KAD","RO","BEU"),
+   variable = sample(c("depth5", "depth10"), 12, replace = TRUE),
+   canopy=sample(c("open", "M_open", "M_closed"), 12, replace = TRUE),
+   value=sample(c(100,500,50,20,112,200,230,250,300,150,160,400))
+ )
> Data1
   site variable   canopy value
1   KOA   depth5 M_closed    20
2   KOB   depth5   M_open   112
3   KOO  depth10 M_closed   100
4    EB  depth10   M_open   400
5   PNS   depth5 M_closed   230
6   BED  depth10 M_closed    50
7    KB  depth10   M_open   250
8   KER  depth10 M_closed   200
9   KAU  depth10 M_closed   500
10  KAD   depth5     open   150
11   RO   depth5   M_open   300
12  BEU   depth5     open   160
> gs1 <- ggplot(Data1, aes(x = canopy, y= value , fill = variable)) + 
+   geom_bar(stat='identity', position = 'dodge', fill = 'darkgray')+
+   xlab("Canopy cover")+ylab("Seed Bank")+ 
+   facet_wrap(~variable,nrow=1)
> gs1
> Data2 <- Data1
> data2.mean = ddply(Data2, .(canopy, variable), summarize,
+                    plant.mean = mean(value), plant.sd = sd(value))
> gs1 <- ggplot(Data2, aes(x = canopy, y= value , fill = variable)) + 
+   geom_bar(stat='identity', position = 'dodge', fill = 'darkgray')+ 
+   geom_errorbar(aes(ymin=plant.mean-plant.sd, ymax = plant.mean +
+                       plant.sd), width = 0.5)+
+   xlab("Canopy cover")+ylab("Seed Bank")+ 
+   facet_wrap(~variable,nrow=1)
> gs1
Error in FUN(X[[i]], ...) : object 'plant.mean' not found

I get the same error with my original data

Muneer
  • 209
  • 1
  • 3
  • 13
  • 1
    What do you mean it doesn't run? What happens? We don't have a sample of your data, so we can't reproduce it to see what the error is – camille Mar 20 '19 at 14:13
  • I have reproduced an example now @camille – Muneer Mar 20 '19 at 15:18
  • 1
    As the error message states: you do not have `plant.mean` in the data. `plant.mean` is available in data2.mean but not in Data2. It is Data2, you provide to ggplot, and as it is not in there, it cannot find it. – KoenV Mar 20 '19 at 16:17
  • @KoenV. I tried changing it to Data1 but same error! – Muneer Mar 20 '19 at 16:32
  • 1
    Data1 doesn't have a column with that name either... – camille Mar 21 '19 at 04:07
  • 1
    Are you still looking for a solution in this matter? – KoenV Mar 22 '19 at 07:02
  • @KoenV. I have solved my problem on my own. I will upload the answer after some time. Thank you so much for asking. – Muneer Mar 22 '19 at 07:22
  • @KoenV. I have added the answer below. If you or anybody else has a different way or more easy way to do the same he/she is welcome to add an answer. – Muneer Mar 22 '19 at 14:37
  • 1
    Congrats. This is basically the same as I intended to do.(The call to `plyr` is not needed). You might consider cleaning up your question a little bit, but that's up to you. – KoenV Mar 22 '19 at 15:20
  • @KoenV. Thank you. You are right. plyr is not needed. I am removing it from my answer. – Muneer Mar 23 '19 at 17:22

1 Answers1

3

The solution to my problem is here. The way I wanted. You need these packages

library(ggplot2)
library(dplyr)

My data frame bank1 was piped into a new data frame cleandata to calculate the mean, sd and se and summarize the results

cleandata <- bank1 %>%
  group_by(canopy, variable) %>%
  summarise(mean.value = mean(value),
            sd.value = sd(value), count = n(),
            se.mean = sd.value/sqrt(count))

The summarized results look like this:

> head(cleandata)
# A tibble: 6 x 6
# Groups:   canopy [3]
  canopy   variable mean.value sd.value count se.mean
  <fct>    <fct>         <dbl>    <dbl> <int>   <dbl>
1 Open     depth5        265.    145.       4   72.4 
2 Open     depth10        20.5    12.8      4    6.41
3 M_Open   depth5         71.8    62.6      4   31.3 
4 M_Open   depth10         6.5     4.20     4    2.10
5 M_Closed depth5         20       8.98     4    4.49
6 M_Closed depth10         0.5     1        4    0.5   

Finally, the plotting was done with this piece of code:

gs1 <- ggplot(cleandata, aes(x=canopy, y=mean.value)) + 
  geom_bar(stat = "identity", color = "black", position = position_dodge())+  
  geom_errorbar(aes(ymin = mean.value - sd.value, ymax = mean.value + sd.value), 
                width=0.2)+
  xlab("Canopy cover")+ylab("Seed Bank")+ 
  facet_wrap(~variable,nrow=1)
gs1  

This gives a graph with error bars (standard deviation) as given below
enter image description here

Problem solved! Cheers!

Muneer
  • 209
  • 1
  • 3
  • 13