2013-10-17 3 views
7

Ho alcuni dati con errori standard associati e vorrei visualizzarli con barre di errore. Questo è quello che ho:Larghezza delle barre di errore in ggplot2

# generate some data 
hod <- data.frame(h = c(1:24,1:24,1:24), mean = 1:(24*3) + runif(24*3, 0, 5),ci = runif(24*3, 0, 2), t = c(rep("a",24),rep("b",24),rep("c",24))) 

pd <- position_dodge(0.3) 
    dayplot <- ggplot(hod, aes(x=h, y=mean, colour=as.factor(t),group=as.factor(t))) + 
    geom_line(position=pd, size=1) + 
    geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci), 
        width=1, 
        size=0.5, 
        position=pd) + 
    geom_point(position=pd, shape=21, size=1, fill="white") + 
    scale_x_continuous(limits=c(-0.5,23.5), 
         breaks=c(0:8*3), 
         labels=ifelse(
           c(0:8*3) < 10, 
           paste('0',c(0:8*3),':00',sep=''), 
           paste(c(0:8*3),':00',sep='') 
          ) 
         ) + 
    xlab("Hour of day") + ylab(ylabel) + labs(title = varlabels[var]) + 
    theme_minimal() + 
    theme(plot.margin = unit(c(1,0,1,1), "cm"), 
      axis.title.x = element_text(vjust=-1), 
      axis.title.y = element_text(angle=90, vjust=0), 
      legend.margin = unit(c(0), "cm"), 
      legend.key.height = unit(c(0.9), "cm"), 
      panel.grid.major = element_line(colour=rgb(0.87,0.87,0.87)), 
      panel.grid.minor = element_blank(), 
      plot.background = element_rect(fill = rgb(0.97,0.97,0.97), linetype=0) 
    ) 

L'unica cosa di interesse è probabilmente:

geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci), 
         width=1, 
         size=0.5, 
         position=pd) 

Dà: all

Ora in cui raggruppare i dati da una variabile fattore (as.factor(t)), I ottieni più linee invece di una, che è quello che voglio, MA, come puoi vedere, le linee orizzontali alle barre di errore sono più strette e non riesco a capire perché. Ho provato a cambiare e persino a rimuovere l'attributo width e size di geom_errorbar, ma non succede nulla. C'è un modo per avere la stessa larghezza delle linee orizzontali per ogni grafico, non importa i dati? Voglio dire, perché dovrebbe variare? O quella larghezza trasmette alcune informazioni?

enter image description here

+1

penso che sarebbe già utile se qualcuno potrebbe spiegare a me l'uso e la funzione di '' width' e size' per 'geom_errorbar', come dovrebbe essere dati- e, quindi, di problem-indipendente. – wnstnsmth

+0

Ho provato a riprodurre il problema con un esempio semplificato e non ho potuto. Non è ovvio, cosa sta andando male. Se fornite i dati è molto più facile trovare il problema. – Roland

+0

Ho lo stesso problema. L'hai mai risolto? – while

risposta

3

Ecco un esempio riproducibile con dati casuali. La soluzione al problema è moltiplicare la larghezza per il numero di classi/fattori che hai. Nella trama seguente, poiché ho usato tre fattori, l'utilizzo di una larghezza di 3 corregge il problema. ggplot2 sembra calcolare la larghezza relativa per il numero di punti dati nel set di dati, piuttosto che i valori numerici sull'asse x. Questo è (IMO) un bug.

library(ggplot2) 
library(grid) 

#plot with factors 
hod <- data.frame(h = c(1:24,1:24,1:24), mean = 1:(24*3) + runif(24*3, 0, 5),ci = runif(24*3, 0, 2), t = c(rep("a",24),rep("b",24),rep("c",24))) 
pd <- position_dodge(0.3) 
    dayplot <- ggplot(hod, aes(x=h, y=mean, colour=as.factor(t),group=as.factor(t))) + 

    geom_line(position=pd, size=1) + 
    geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci), 
        width=1, 
        size=0.5, 
        position=pd) + 
    geom_point(position=pd, shape=21, size=1, fill="white") + 
    scale_x_continuous(limits=c(-0.5,23.5), 
         breaks=c(0:8*3), 
         labels=ifelse(
           c(0:8*3) < 10, 
           paste('0',c(0:8*3),':00',sep=''), 
           paste(c(0:8*3),':00',sep='') 
          ) 
         ) + 
    xlab("Hour of day") + 
    theme_minimal() + 
    theme(plot.margin = unit(c(1,0,1,1), "cm"), 
      axis.title.x = element_text(vjust=-1), 
      axis.title.y = element_text(angle=90, vjust=0), 
      legend.margin = unit(c(0), "cm"), 
      legend.key.height = unit(c(0.9), "cm"), 
      panel.grid.major = element_line(colour=rgb(0.87,0.87,0.87)), 
      panel.grid.minor = element_blank(), 
      plot.background = element_rect(fill = rgb(0.97,0.97,0.97), linetype=0) 
    ) 
print(dayplot) 


#plot without factors 
hod <- data.frame(h = c(1:24,1:24,1:24), mean = 1:(24) + runif(24, 0, 5),ci = runif(24, 0, 2)) 
pd <- position_dodge(0.3) 
    dayplot <- ggplot(hod, aes(x=h, y=mean)) + 

    geom_line(position=pd, size=1) + 
    geom_errorbar(aes(ymin=mean-ci, ymax=mean+ci), 
        width=1, 
        size=0.5, 
        position=pd) + 
    geom_point(position=pd, shape=21, size=1, fill="white") + 
    scale_x_continuous(limits=c(-0.5,23.5), 
         breaks=c(0:8*3), 
         labels=ifelse(
           c(0:8*3) < 10, 
           paste('0',c(0:8*3),':00',sep=''), 
           paste(c(0:8*3),':00',sep='') 
          ) 
         ) + 
    xlab("Hour of day") + 
    theme_minimal() + 
    theme(plot.margin = unit(c(1,0,1,1), "cm"), 
      axis.title.x = element_text(vjust=-1), 
      axis.title.y = element_text(angle=90, vjust=0), 
      legend.margin = unit(c(0), "cm"), 
      legend.key.height = unit(c(0.9), "cm"), 
      panel.grid.major = element_line(colour=rgb(0.87,0.87,0.87)), 
      panel.grid.minor = element_blank(), 
      plot.background = element_rect(fill = rgb(0.97,0.97,0.97), linetype=0) 
    ) 

print(dayplot) 
+0

Ora, dove sta la differenza con il mio esempio? Stai ancora usando 'width = 1', per quanto posso vedere. Vuoi dire che dovresti usare 'width = 3'? – wnstnsmth

+0

Sì. Prova il tuo esempio con width = 9 (o comunque molti livelli hai). – thc

+1

Grazie. Ho pubblicato un problema su GitHub https://github.com/hadley/ggplot2/issues/1068 – wnstnsmth