Search code examples
rggplot2statistical-test

How to separate bar plot?


I'm trying to plot a bar chart that represents a two way anova, but the bars are overlapping, does anyone know an easy way to plot a data set that way?

data <- structure(list(nozzle = c("XR", "XR", "XR", "XR", "XR", "XR", "XR", "XR", 
                                  "XR", "XR", "XR", "XR", "XR", "XR", "XR", "XR", 
                                  "AIXR", "AIXR", "AIXR", "AIXR", "AIXR", "AIXR", 
                                  "AIXR", "AIXR", "AIXR", "AIXR", "AIXR", "AIXR", 
                                  "AIXR", "AIXR", "AIXR", "AIXR"), 
                       trat = c("Cle 12.8", "Cle 12.8", "Cle 12.8", "Cle 12.8", 
                                "Cle 34", "Cle 34", "Cle 34", "Cle 34", "Cle 12.8", 
                                "Cle 12.8", "Cle 12.8", "Cle 12.8", "Cle 34", "Cle 34", 
                                "Cle 34", "Cle 34", "Cle 12.8", "Cle 12.8", "Cle 12.8", 
                                "Cle 12.8", "Cle 34", "Cle 34", "Cle 34", "Cle 34", 
                                "Cle 12.8", "Cle 12.8", "Cle 12.8", "Cle 12.8", "Cle 34", 
                                "Cle 34", "Cle 34", "Cle 34"), 
                       adj = c("Without", "Without", "Without", "Without", "Without", 
                               "Without", "Without", "Without", "With", "With", "With", 
                               "With", "With", "With", "With", "With", "Without", "Without", 
                               "Without", "Without", "Without", "Without", "Without", "Without", 
                               "With", "With", "With", "With", "With", "With", "With", "With"), 
                       dw1 = c(3.71, 5.87, 6.74, 1.65, 0.27, 0.4, 0.37, 0.34, 0.24, 0.28, 0.32, 
                               0.38, 0.39, 0.36, 0.32, 0.28, 8.24, 10.18, 11.59, 6.18, 0.2, 0.23, 
                               0.2, 0.31, 0.28, 0.25, 0.36, 0.27, 0.36, 0.37, 0.34, 0.19)), 
                  row.names = c(NA, -32L), 
                  class = c("tbl_df", "tbl", "data.frame"))

data_sum <- summarySE(data,
                          measurevar="dw1",
                          groupvars=c("nozzle", "trat","adj"))

ggplot(data_sum,
       aes(x = as.factor(trat), y = dw1,group = as.factor(nozzle), fill = as.factor(adj),
           ymax=dw1+se, ymin=dw1-se))  +
  geom_bar(stat="identity", colour = "black", width = 0.2, show_guide = FALSE, position="dodge")  +
  scale_fill_manual(name = "Presence of adjuvants" ,
                    values = c('grey80', 'grey30'),
                    labels = c("Without",
                               "With"))  +
  geom_errorbar(position=position_dodge(width=0.7),
                width=0.0, size=0.5, color="black")  +
  labs(x = "Treatment g.i.a. ha-¹",
       y = "Dry Mass (g)")  +
  theme_classic()+ facet_grid(nozzle ~ ., scales = "free_y")

I expected something like that:

expected

But with two factors in the same plot and one common Y-axis.


Solution

  • The problem with your code is that you need to use the function dodge2 instead of dodge. See this reference. This is the code that can help you.

    ggplot(data_sum ,aes( x = trat, y = dw1,  group = nozzle, fill = adj)) + 
    geom_bar( colour = "black", width = 0.5, stat="identity",
             # Position dodge2 solve the overlapping problem
             # (padding) Add distance between bar in the same group
             position = position_dodge2(padding = 0.5)) + 
    scale_fill_manual(name = "Presence of adjuvants",
                     values = c('grey80', 'grey30'),
                     labels = c("Without",
                                "With")) +
    geom_errorbar(aes(ymax = dw1 + se, ymin = dw1 - se),
                 # Need to be consistent with bar position
                 # (padding) Here it will control the width of
                 # top and botton horizontal line. If you want
                 # you can choose padding = 1 to not have those lines
                 position = position_dodge2(padding = 1.3),
                 # (width) Control the width of error_bar and
                 # in this case has a side effect of shift the 
                 # position of this error bar.
                 # Then this width need to be the same of geom_bar
                 width = 0.5, 
                 size = 0.5,
                 color="black")  +
    labs(x = "Treatment g.i.a. ha-¹",
        y = "Dry Mass (g)") +
    facet_grid(.  ~ nozzle, scales = "free_y")
    

    enter image description here