2013-05-19 14 views
11

Staram się umieszczać paski błędów we właściwych miejscach na stosie słupków. Jak czytałem na wcześniejszym poście, użyłem ddply, aby ułożyć paski błędów. To zmieniło kolejność układania, więc zamówiłem czynnik. Teraz wydaje się, że paski błędów są poprawne na jednym zestawie taktów, ale nie na drugim. To, czego chcę, to wykres, który wygląda tak, jak poniżej, tylko ze standardowym błędem wyświetlanym z paskiem błędów. Wymieniam dput oryginalnych danych i danych ddply, a także zestaw danych. enter image description hereSłupki błędów na ułożonym słupku 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 do szczegółowych kwestii, w tym powtarzalny przykład. –

+3

Podczas korzystania z barplota dla danych innych niż liczba jest zasadniczo zła i dla każdego wykresu, który narysujesz (z paskami błędu), słodki szczeniak i/lub kociak umiera, przegrywam z powodu dobrze uformowanego pytania i odtwarzalnego przykładu. –

Odpowiedz

10

Wartości zarówno ybegin i yend, zakres paska błędów jest zbyt niski dla danych bacteria. Ponieważ paski dla bacteria znajdują się na górze pasków fungi, wysokość pasków fungi (plydat$copy[plydat$org == "fungi"]) musi zostać dodana do wartości paska błędów danych 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, chociaż nie jestem wielkim fanem ułożonych wykresów, zobacz moją odpowiedź na alternatywę. –

9

Osobiście nie jestem lubiący skumulowanym wykresie słupkowym, zwłaszcza gdy liczba ułożonych prętów jest duża (co nie jest dla ciebie). Głównym problemem jest to, że wszystkie oprócz najniższego stosu nie mają tej samej linii bazowej. W twoim przypadku trudno porównać klasę pomarańczową bacteria, ponieważ nie mają one tej samej bazy (wartość y, copy).

proponuję użyć działkę o nazwie dotplot:

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

pamiętać, że wartość copy nie sumuje się tutaj jak to było w sterach BarChart. Ponieważ mają tę samą wartość bazową: copy (0), możesz łatwo porównać różne wartości bacteria. Ponadto zamieniam oś X i Y, aby ułatwić porównanie wartości copy (wystarczy usunąć coord_flip, aby zobaczyć, jak źle działa porównanie copy).

Jedynym minusem jest to, że nie ma łatwego sposobu na oszacowanie sumy fungi i bacteria. W zależności od tego, co wykres ma pokazywać (historia wykresu), może to być problem, ale nie musi. Możesz dodać oddzielną dodatkową kategorię do org, tj. both, która jest sumą obu kategorii, aby temu zaradzić. Oczywiście interpretacja błędu w tej zsumowanej kategorii jest nietrywialna.

3

Z połączenia powyższych odpowiedzi, myślę, że zamierzam pójść z czymś takim.

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

Powiązane problemy