2015-09-29 39 views
3

我已經用facet_grid做了一個圖表,用於可視化每天每個處理的每組中的鋰的百分比。用ggplot和facet_grid指定誤差線

library(ggplot2) 
library(Rmisc) 
library(plyr) 

mus2 <- summarySE(mus, measurevar="litium", 
         groupvars=c("treatment", "group", "day"), na.rm = TRUE) 

mus2 

mus3 <- mus2 
mus3$group <- factor(mus3$group) 

ms.chl<- ggplot(mus3, aes(x=group, y=litium, fill=treatment)) + 
    geom_bar(stat="identity", colour="black") + facet_grid(~day) + theme_bw() 
ms.chl 

與由此產生:

enter image description here

對於我有兩個問題:

我不能讓爲litium內容每組正確的錯誤吧。我已經嘗試過,但每次治療只能得到錯誤消息。

ms.chl + geom_errorbar(aes(ymin=litium-se, ymax=litium+se), size=0.5, 
     width=.25,      
     position=position_dodge(.9)) + 
facet_grid(~day) 

enter image description here

我想有誤差條從總的各組

,並在那之後,我的第二個問題是:是否有可能代表每組的絕對值和每個治療只有百分比?

數據集(畝):

litium group treatment day 
0.009439528 1 Control day1 
0.005115057 1 Control day1 
0.009742297 1 Control day1 
0.016515625 2 Control day1 
0.01074537 2 Control day1 
0.016300836 2 Control day1 
0.009538339 3 Control day1 
0.010609746 3 Control day1 
0.008928012 3 Control day1 
0.009425325 1 Control + bird day1 
0.00561831 1 Control + bird day1 
0.014622517 1 Control + bird day1 
0.017702439 2 Control + bird day1 
0.010545045 2 Control + bird day1 
0.029109907 2 Control + bird day1 
0.013737568 3 Control + bird day1 
0.015174405 3 Control + bird day1 
0.014583832 3 Control + bird day1 
0.009244079 1 Control day2 
0.006591033 1 Control day2 
0.007592587 1 Control day2 
0.013676745 2 Control day2 
0.016208676 2 Control day2 
0.017593952 2 Control day2 
0.014003037 3 Control day2 
0.01163581 3 Control day2 
0.011643067 3 Control day2 
0.009229506 1 Control + bird day2 
0.006423714 1 Control + bird day2 
0.008653163 1 Control + bird day2 
0.012441379 2 Control + bird day2 
0.0204346 2 Control + bird day2 
0.010017788 2 Control + bird day2 
0.009745063 3 Control + bird day2 
0.00967963 3 Control + bird day2 
0.010291306 3 Control + bird day2 
0.009466604 1 Fence day2 
0.019611081 2 Fence day2 
0.006796444 2 Fence day2 
0.018928695 2 Fence day2 
0.007787736 3 Fence day2 
0.009409897 3 Fence day2 

回答

5

第一和最簡單的解決辦法是讓你的條形圖並排側,而不是堆積。然後,您需要更改代碼的唯一方法是將position="dodge"添加到geom_bar(),然後按照您的代碼運行其餘代碼。這還有另外一個好處,就是可以直接比較不同鋼筋的高度,避免在鋼筋中間放置誤差鋼筋。

ms.chl<- ggplot(mus3, aes(x=group, y=litium, fill=treatment)) + 
    geom_bar(stat="identity", colour="black",position="dodge") + 
    facet_grid(~day) + theme_bw() 
ms.chl + geom_errorbar(aes(ymin=litium-se, ymax=litium+se), size=0.5, 
    width=.25,position=position_dodge(.9)) + 
    facet_grid(~day) 

enter image description here

要在堆疊的條形圖添加誤差線,你必須有確保棒上的litium累積和居中。對於這一點,你可以在ave()使用cumsum()

mus3 <- within(mus3,lit2 <- ave(litium,group,day,FUN=cumsum)) 

,當你調用geom_errorbar()並沒有躲閃然後使用lit2代替litium

ms.chl<- ggplot(mus3, aes(x=group, y=litium, fill=treatment)) + 
    geom_bar(stat="identity", colour="black") + facet_grid(~day) + theme_bw() 

ms.chl + geom_errorbar(aes(ymin=lit2-se, ymax=lit2+se), size=0.5, 
         width=.25) + facet_grid(~day) 

enter image description here

如果你只是想該組的誤差條,然後你必須得到治療內整個集團的錯誤,而不是羣體,但你不能只想補充一點,直接基於整個羣體的手段,因爲這些都是手段和堆積條形圖具有手段的總和,所以你必須總結從mus3的手段。

musgroup <- summarySE(mus, measurevar="litium", 
         groupvars=c("group", "day"), na.rm = TRUE) 

musgroupsum <- ddply(mus3,.(group,day),summarize,lit2 = sum(litium)) 

mus4 <- merge(musgroup,musgroupsum) 

ms.chl<- ggplot() + 
    geom_bar(data=mus3, aes(x=group, y=litium, fill=treatment), 
      stat="identity", colour="black") + facet_grid(~day) + theme_bw() 

ms.chl + geom_errorbar(data=mus4,aes(x=group,ymin=lit2-se, ymax=lit2+se), 
         size=0.5, width=.25) 

enter image description here

在這一點上,雖然,它開始變得有點荒謬。堆積手段不是羣體手段 - 它們是羣體手段的總和,但錯誤是針對羣體手段的。當你看圖時,誤差線與它們所代表的平均值相比看起來會更小,因爲它們的中心位置比它們本應該高的多。看起來你正在尋找的是羣體均值的表示,它可以讓你看到每種治療對該羣體均值的貢獻。一種顯示此方法的方法是縮放柱狀圖大小,使累積總和集中在每個組的正確平均值上。

mus3 <- within(mus3,lit3 <- ave(litium,group,day,FUN=function(x) x/length(x))) 

ms.chl<- ggplot() + 
    geom_bar(data=mus3, aes(x=group, y=lit3, fill=treatment), 
      stat="identity", colour="black") + facet_grid(~day) + 
    theme_bw() + ylab("litium") 

ms.chl + geom_errorbar(data=mus4,aes(x=group,ymin=litium-se, ymax=litium+se), 
         size=0.5,width=.25) 

enter image description here

+0

謝謝您的回答,但對於每一組我只需要一個列,因此每組litium總在barplot被expresed。治療必須是該專欄的一部分,這樣我可以看到他們對總功率的貢獻比例。因此,總結一下,我需要每個組的總功率的誤差棒,而不是每個治療的 – kumbu

+0

我已更新以提供幾種不同的解決方案。我希望其中的一個爲你工作或讓你找到你需要的解決方案。 –