2016-02-16 2 views
2

J'ai un problème avec mon histogramme - les barres d'erreur apparaissent simplement sur le coin des colonnes de la variable de regroupement plutôt que sur celles-ci d'une manière centralisée . Le code J'utilise est le suivant:Problème en plaçant des barres d'erreur au centre des colonnes dans ggplot()

a <- data.frame (Cond = c("In", "In", "Out", "Out"), 
       Temp = c("Hot", "Cool", "Hot", "Cool"), 
       Score = c(.03, -.15, 0.84, 0.25), 
       SE = c(.02, .08, .14, .12)) 
a.bar <- ggplot (data = a, aes(x = Cond, y = Score, fill = Temp)) + 
      theme_bw() + theme(panel.grid = element_blank()) + 
      coord_cartesian (ylim = c(-0.5, 1)) + 
      geom_bar (aes(fill = Temp), stat = "identity", position = "dodge", width = .5) + 
      geom_errorbar (aes(ymin = Score - SE, ymax = Score + SE, group = Cond), position = position_dodge(.9), width = .08) + 
      labs(y = "Scores" , x = "Cond") + 
      scale_y_continuous (breaks = pretty_breaks(n=8)) + 
      theme(legend.title = element_blank()) + 
      theme(legend.position = "right") 

Les codes alternatifs que j'ai essayé, que je ne pouvais pas se rendre au travail soit, inclus l'ajout « show.legend = FALSE » à geom_bar(); ajouter "facet_wrap (~ Cond)" plot.a; et en introduisant "fill = Temp" dans ggplot (aes()). La solution la plus proche était quand je l'ai changé l'argument en position_dodge():

geom_bar (aes(fill = Temp), stat = "identity", position = position_dodge(width = .5)) + 
geom_errorbar (aes(ymin = Score - SE, ymax = Score + SE, group = Cond), position = position_dodge(.5), width = .08) + 

(le reste du code reste le même). Cela a déplacé les barres d'erreur vers le centre des colonnes, mais a également déplacé les colonnes l'une vers l'autre, les faisant éventuellement se chevaucher (voir la figure ci-jointe). see attached figure

J'apprécierais beaucoup l'aide à ce sujet.

Merci!

Répondre

3

Belle question. Quelques commentaires:

  1. En général, il est une bonne pratique de mettre toutes vos esthétique en les appeler, et de passer outre ggplot() original avec l'esthétique différentes que si nécessaire dans les appels geom_xyz() individuels. Dans votre code, vous définissez l'esthétique de remplissage deux fois, une fois en ggplot et une fois en geom_bar. Vous définissez également l'esthétique du groupe au geom_errorbar(). Je ne pense pas que ce soit le problème ultime, mais ils ont rendu plus difficile le débogage de votre code.

  2. Le principal problème est que l'argument width dans geom_bar doit correspondre à l'argument position_dodge() à l'intérieur geom_errorbar. Donc, si vous avez

    # ... 
    geom_bar(stat = "identity", position = "dodge", width = 0.5) 
    # ... 
    

    Ensuite, vous devez vous assurer que votre geom_errorbar() ressemble

    # ... 
    geom_errorbar(width = .08, position = position_dodge(0.5)) 
    # ... 
    

Mettre le tout ensemble:

require(ggplot2) 
require(scales) 

# define data 
a <- data.frame (Cond = c("In", "In", "Out", "Out"), 
       Temp = c("Hot", "Cool", "Hot", "Cool"), 
       Score = c(.03, -.15, 0.84, 0.25), 
       SE = c(.02, .08, .14, .12)) 

# return plot with everything except error bars 
a.bar <- ggplot (data = a, aes(x = Cond, 
           y = Score, 
           fill = Temp, 
           ymin = Score - SE, 
           ymax = Score + SE)) + 
      theme_bw() + 
      theme(panel.grid = element_blank()) + 
      coord_cartesian(ylim = c(-0.5, 1)) + 
      # manually setting the width means we will have to tell geom_errorbar() about the new width 
      geom_bar(stat = "identity", position = "dodge", width = 0.5) + 
      labs(y = "Scores", x = "Cond") + 
      scale_y_continuous(breaks = pretty_breaks(n = 8)) + 
      theme(legend.title = element_blank()) + 
      theme(legend.position = "right") 

# show plot w/ errorbars, note that argument to position_dodge is same as width supplied above 
a.bar + geom_errorbar(width = .08, position = position_dodge(0.5)) 

# save results 
ggsave('SO_35424162.png') 

Final graph