2013-05-19 12 views
11

Non riesco a inserire le barre di errore nella posizione corretta su una barra impilata. Come ho letto su un post precedente ho usato ddply per impilare le barre di errore. Poi ha cambiato l'ordine dell'impilamento, quindi ho ordinato il fattore. Ora sembra che le barre di errore siano corrette su un set di barre ma non sull'altro. Quello che voglio è un grafico che appare come sotto, solo con l'errore standard mostrato con le barre di errore. Sto elencando il dput dei dati originali, i dati di ddply e il set di dati. enter image description hereBar di errore sulla barra impilata ggplot2

Suz2$org <- factor(Suz2$org, levels = c('fungi','bacteria'),ordered = TRUE) 

library(plyr) 
plydat <- ddply(Suz2,.(org, group, time),transform,ybegin = copy - se,yend = copy + se) 

colvec <-c("blue", "orange") 

ggplot(plydat, aes(time, copy)) + 
    geom_bar(aes(fill = factor(org)), stat="identity", width = 0.7) + 
    scale_fill_manual(values = colvec) + 
    facet_wrap(~group,nrow = 1)+ 
    geom_errorbar(aes(ymax=ybegin , ymin= yend),width=.5) + 
    theme(panel.background = element_rect(fill='white', colour='white'), 
     panel.grid = element_line(color = NA), 
     panel.grid.minor = element_line(color = NA), 
     panel.border = element_rect(fill = NA, color = "black"), 
     axis.text.x = element_text(size=10, colour="black", face = "bold"), 
     axis.title.x = element_text(vjust=0.1, face = "bold"), 
     axis.text.y = element_text(size=12, colour="black"), 
     axis.title.y = element_text(vjust=0.2, size = 12, face = "bold")) 

dput (plydat)

structure(list(org = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("fungi", "bacteria" 
), class = c("ordered", "factor")), time = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("0W", 
"6W"), class = "factor"), copy = c(97800000, 15500000, 40200000, 
10400000, 55100000, 14300000, 1.6e+07, 8640000, 2.98e+08, 77900000, 
2.33e+08, 2.2e+08, 3.37e+08, 88400000, 3.24e+08, 1.89e+08), group = structure(c(3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("Native D0", 
"Native D707", "Notill D0", "Notill D707"), class = "factor"), 
    se = c(11100000, 2810000, 7110000, 2910000, 1.7e+07, 1500000, 
    1930000, 2980000, 43900000, 20100000, 56400000, 41200000, 
    75700000, 22500000, 57500000, 28100000), ybegin = c(86700000, 
    12690000, 33090000, 7490000, 38100000, 12800000, 14070000, 
    5660000, 254100000, 57800000, 176600000, 178800000, 261300000, 
    65900000, 266500000, 160900000), yend = c(108900000, 18310000, 
    47310000, 13310000, 72100000, 15800000, 17930000, 11620000, 
    341900000, 9.8e+07, 289400000, 261200000, 412700000, 110900000, 
    381500000, 217100000)), .Names = c("org", "time", "copy", 
"group", "se", "ybegin", "yend"), row.names = c(NA, -16L), class = "data.frame") 

dput (Suz2)

structure(list(org = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("fungi", "bacteria" 
), class = c("ordered", "factor")), time = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("0W", 
"6W"), class = "factor"), copy = c(97800000, 15500000, 40200000, 
10400000, 55100000, 14300000, 1.6e+07, 8640000, 2.98e+08, 77900000, 
2.33e+08, 2.2e+08, 3.37e+08, 88400000, 3.24e+08, 1.89e+08), group = structure(c(3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L), .Label = c("Native D0", 
"Native D707", "Notill D0", "Notill D707"), class = "factor"), 
    se = c(11100000, 2810000, 7110000, 2910000, 1.7e+07, 1500000, 
    1930000, 2980000, 43900000, 20100000, 56400000, 41200000, 
    75700000, 22500000, 57500000, 28100000)), .Names = c("org", 
"time", "copy", "group", "se"), row.names = c(NA, -16L), class = "data.frame") 

Suz2

org time  copy  group  se 
1  fungi 0W 9.78e+07 Notill D0 11100000 
2  fungi 0W 1.55e+07 Notill D707 2810000 
3  fungi 0W 4.02e+07 Native D0 7110000 
4  fungi 0W 1.04e+07 Native D707 2910000 
5  fungi 6W 5.51e+07 Notill D0 17000000 
6  fungi 6W 1.43e+07 Notill D707 1500000 
7  fungi 6W 1.60e+07 Native D0 1930000 
8  fungi 6W 8.64e+06 Native D707 2980000 
9 bacteria 0W 2.98e+08 Notill D0 43900000 
10 bacteria 0W 7.79e+07 Notill D707 20100000 
11 bacteria 0W 2.33e+08 Native D0 56400000 
12 bacteria 0W 2.20e+08 Native D707 41200000 
13 bacteria 6W 3.37e+08 Notill D0 75700000 
14 bacteria 6W 8.84e+07 Notill D707 22500000 
15 bacteria 6W 3.24e+08 Native D0 57500000 
16 bacteria 6W 1.89e+08 Native D707 28100000 
+3

+1 per domanda dettagliata, comprende anche un esempio riproducibile. –

+3

Mentre usare il barplot per dati diversi dal conteggio è fondamentalmente sbagliato e per ogni barplot disegnato (con barre di errore) muore un cucciolo e/o un gattino carino, io sto facendo il massimo a causa di una domanda ben formata e di un esempio riproducibile. –

risposta

10

I valori per ybegin e yend, l'intervallo del errorbar, è troppo basso per i dati bacteria. Poiché le barre per bacteria sono sopra le barre fungi, l'altezza delle barre fungi (plydat$copy[plydat$org == "fungi"]) deve essere aggiunta ai valori errar dei dati bacteria.

plydat[plydat$org == "bacteria", ] 
    <- transform(plydat[plydat$org == "bacteria", ], 
       ybegin = ybegin + plydat[plydat$org == "fungi", "copy"], 
       yend = yend + plydat[plydat$org == "fungi", "copy"]) 

enter image description here

+1

+1 anche se non sono un grande fan dei diagrammi a barre in pila, vedere la mia risposta per un'alternativa. –

9

Personalmente, io non sono davvero appassionato di un grafico a barre in pila, soprattutto quando il numero di barre in pila è di grandi dimensioni (che non è il caso per voi). Il problema principale è che tutti, tranne lo stack più basso, non condividono la stessa linea di base. Nel tuo caso, è difficile confrontare la classe arancione bacteria in quanto non condividono la stessa base (valore y, copy).

propongo di usare un complotto chiamato un grafico a punti:

library(ggplot2) 
theme_set(theme_bw()) 
ggplot(plydat, aes(time, copy, color = org)) + 
    geom_point() + facet_wrap(~group, ncol = 1) + 
    geom_errorbar(aes(ymax=ybegin , ymin= yend), width = 0) + coord_flip() 

enter image description here

Nota che il valore copy non è additivo qui perché era nella barchart impilati. Poiché condividono lo stesso valore di base copy (0), puoi facilmente confrontare i diversi valori di bacteria. Inoltre, scambio l'asse x e y per semplificare il confronto del valore di copy (è sufficiente rimuovere lo coord_flip per vedere quanto è negativo il confronto con copy).

L'unico vero svantaggio è che non esiste un modo semplice per giudicare la somma di fungi e bacteria. A seconda di ciò che il grafico è destinato a mostrare (la storia del grafico) questo può o non può essere un problema. È possibile aggiungere una categoria aggiuntiva separata a org, ad esempio both, che è la somma di entrambe le categorie, per ovviare a questo problema. Naturalmente, interpretare l'errore in questa categoria sommata non è banale.

3

Da una combinazione delle risposte di cui sopra penso di andare con qualcosa di simile.

plydat <- ddply(Suz2,.(org),transform,ybegin = copy - se,yend = copy + se) 

colvec <-c("blue", "orange") 

ggplot(plydat, aes(time, copy, color = factor(org))) + 
    geom_point(size = 3.5) + facet_wrap(~group, ncol = 4) + 
    scale_color_manual(values = colvec) + 
    geom_errorbar(aes(ymax=ybegin , ymin= yend), width = 0.08, 
     color = "black", size = 0.1) + 
    theme(panel.background = element_rect(fill='white', colour='white'), 
     panel.grid = element_line(color = NA), 
     panel.grid.minor = element_line(color = NA), 
     panel.border = element_rect(fill = NA, color = "black"), 
     strip.background = element_blank(), 
     axis.text.x = element_text(size=10, colour="black", face = "bold"), 
     axis.title.x = element_text(vjust=0.1, face = "bold"), 
     axis.text.y = element_text(size=12, colour="black"), 
     axis.title.y = element_text(vjust=0.2, size = 12, face = "bold")) 

enter image description here

Problemi correlati