2012-10-24 6 views
10

Ho un insieme di dati in cui le misure sono effettuate per i diversi gruppi a diversi giorni.Come fare schivare in geom_bar d'accordo con schivare in geom_errorbar, geom_point

Desidero avere barre affiancate che rappresentano le misurazioni nei diversi giorni per i diversi gruppi con i gruppi di barre distanziati in base al giorno di misurazione con le bande errate sovrapposte a loro.

Ho problemi con il dodging in geom_bar d'accordo con la schivata su geom_errorbar.

Qui è un semplice pezzo di codice:

days   = data.frame(day=c(0,1,8,15)); 
groups  = data.frame(group=c("A","B","C","D", "E"), means=seq(0,1,length=5)); 


my_data  = merge(days, groups); 


my_data$mid = exp(my_data$means+rnorm(nrow(my_data), sd=0.25)); 
my_data$sigma = 0.1; 


png(file="bar_and_errors_example.png", height=900, width=1200); 
plot(ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) + 
    geom_bar  (position=position_dodge(width=0.5))         + 
    geom_errorbar (position=position_dodge(width=0.5), colour="black")     + 
    geom_point (position=position_dodge(width=0.5), aes(y=mid, colour=group))); 
dev.off(); 

Nella trama, i errorsegments appare con un offset fisso dal suo bar (sorry, no trame consentiti per i neofiti, anche se ggplot2 è il soggetto).

Quando binwidth viene regolato in geom_bar, l'offset non è fisso e cambia di giorno in giorno.

Avviso, che geom_errorbar e geom_point schivare in tandem. Come faccio ad avere geom_bar a d'accordo con gli altri due?

Qualsiasi aiuto apprezzato.

risposta

12

I problemi di allineamento sono dovuti, in parte, per le barre non rappresenta i dati che si desidera. Le seguenti linee correttamente:

ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) + 
    geom_bar  (position=position_dodge(), aes(y=mid), stat="identity") + 
    geom_errorbar (position=position_dodge(width=0.9), colour="black") + 
    geom_point (position=position_dodge(width=0.9), aes(y=mid, colour=group)) 

enter image description here

3

La prima modifica ho riformattato il codice secondo la advanced R style guide.

days <- data.frame(day=c(0,1,8,15)) 

groups <- data.frame(
    group=c("A","B","C","D", "E"), 
    means=seq(0,1,length=5) 
    ) 

my_data <- merge(days, groups) 

my_data$mid <- exp(my_data$means+rnorm(nrow(my_data), sd=0.25)) 
my_data$sigma <- 0.1 

Ora, quando guardiamo i dati, vediamo che quel giorno è un fattore e tutto il resto è lo stesso.

str(my_data) 

Per rimuovere lo spazio vuoto dal grafico, ho convertito la colonna del giorno in fattori. VERIFICARE che i livelli siano nell'ordine corretto prima di procedere.

my_data$day <- as.factor(my_data$day) 
levels(my_data$day) 

Il prossimo cambiamento che ho fatto definiva y nei vostri aes argomenti. Come sono sicuro tu sappia, questo permette a ggplot di sapere dove cercare i valori di y. Poi ho cambiato l'argomento grado di "schivare" e ha aggiunto l'argomento stat="identity". L'argomento "identity" dice a ggplot di tracciare y in x. geom_errorbar eredita la posizione di schivare da geom_bar in modo da poter lasciare non specificato, ma geom_point non così è necessario specificare che il valore. L'espediente predefinito è position_dodge(.9).

ggplot(data = my_data, 
aes(x=day, 
    y= mid, 
    ymin=mid-sigma, 
    ymax=mid+sigma,  
    fill=group)) + 
    geom_bar(position="dodge", stat = "identity") + 
    geom_errorbar(position = position_dodge(), colour="black") + 
    geom_point(position=position_dodge(.9), aes(y=mid, colour=group)) 

enter image description here

Problemi correlati