使用ggplot和facet_grid指定错误栏

kum*_*mbu 3 r ggplot2 errorbar

我已经制作了一个图表,facet_grid用于显示每天每个治疗组中每个组中的litium百分比.

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
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

为此我有两个问题:

我无法为litium内容PER GROUP制作正确的误差线.我试过这个,但每次治疗我只得到误差棒.

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

在此输入图像描述

我想从每组的总数中得到误差线

之后,我的第二个问题是:是否有可能代表每组的绝对值和每种治疗的百分比?

数据集(mus):

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
Run Code Online (Sandbox Code Playgroud)

Sam*_*son 6

第一个也是最简单的解决方案是将您的条形图并排放置而不是堆叠.然后,您需要在代码中进行更改的唯一方法是添加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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要在堆积条形图上添加误差线,您必须确保条形以累积和为中心litium.为此,您可以cumsum()ave()以下内容中使用:

mus3 <- within(mus3,lit2 <- ave(litium,group,day,FUN=cumsum))
Run Code Online (Sandbox Code Playgroud)

然后使用lit2而不是litium在你打电话时geom_errorbar(),不要躲闪.

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你只想要组的误差条,那么你必须得到整个组的错误,而不是治疗中的组,但你不能只是直接添加到基于整个组的平均值,因为那些是手段和堆积条形图具有均值的总和,所以你必须总结平均值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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

不过,在这一点上,它开始有点荒谬.堆叠均值不是组均值 - 它们是组均值的总和,但误差是组均值.当你看到这个数字时,误差条相对于它们所代表的平均值看起来会更小,因为它们的中心位置比它们应该的高得多.看起来你正在寻找的是群体平均值的表示,它允许你看到每个治疗对该群体意义的贡献.显示这一点的一种方法是缩放条形图大小,以便累积总和以每个组的正确平均值为中心.

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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述