簡體   English   中英

堆積條ggplot2上的誤差線

[英]Error bars on stacked bar ggplot2

我正在努力將誤差棒放在堆積條上的正確位置。 正如我在之前的帖子中讀到的那樣,我使用ddply來堆疊錯誤欄。 然后,這改變了堆疊的順序,所以我訂購了因子。 現在看來,錯誤條在一組條形圖上是正確的而在另一組條形圖上是正確的。 我想要的是一個如下圖所示的圖表,只是顯示帶有誤差條的標准誤差。 我列出了原始數據和ddply數據以及數據集的輸入。 在此輸入圖像描述

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

ybeginyend的值,即ybegin yend的范圍,對於bacteria數據來說太低了。 由於用於桿bacteria是在頂部fungi棒,所述的高度fungi桿( plydat$copy[plydat$org == "fungi"]已被添加到的errorbar值bacteria數據。

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

在此輸入圖像描述

就個人而言,我並不是真的喜歡堆積的條形圖,特別是當堆積的條形數量很大時(對你來說情況並非如此)。 主要問題是除了最低堆棧之外的所有堆棧都不共享相同的基線。 在您的情況下,很難比較橙色bacteria類,因為它們不共享相同的基礎(y值, copy )。

我建議使用一個名為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()

在此輸入圖像描述

請注意,此處的copy值不是疊加條形圖中的附加值。 因為它們共享相同的基本copy值(0),所以您可以輕松地比較不同的bacteria值。 另外,我交換x軸和y軸以便於比較copy的值(只需刪除coord_flip以查看比較copy有多糟糕)。

唯一真正的缺點是沒有簡單的方法來判斷fungibacteria的總和。 根據圖表的顯示內容(圖表的故事),這可能是也可能不是問題。 您可以為org添加單獨的其他類別,即both都是兩個類別的總和,以解決此問題。 當然,解釋這個總和類別中的錯誤並非易事。

從上述答案的組合我想我會用這樣的東西。

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"))

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM