使用ggplot和facet_grid指定误差条

3
我用 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

我的问题有两个:

我无法为每个组的锂含量制作适当的误差线。我已经尝试过这样做,但我只得到了每种处理的误差线。

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

在此输入图片描述

我希望每组的总和都有误差线。

其次,我的第二个问题是:是否可以只表示每个处理的绝对值和百分比?

数据集(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
1个回答

7

第一个也是最简单的解决方案是将你的条形图设置为并排而不是堆叠。然后在你的代码中只需要添加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)

在此输入图片描述

如果您只想获得组的误差线,则必须获取整个组的误差,而不是针对治疗的组。但您不能将其直接添加到基于整个组的均值中,因为这些是均值,而堆叠条形图具有均值总和,因此您必须从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


谢谢您的回答,但是对于每个组,我只需要一列,以便在条形图中表达每个组的锂总量。治疗方法必须成为该列的一部分,以便我可以看到它们对总锂的贡献比例。因此,总结一下,我需要每个组的总锂的误差线,而不是每种治疗方法的误差线。 - kumbu
我已经更新了,提供了几种不同的解决方案。希望其中一种适用于您或能帮助您找到所需的解决方案。 - Sam Dickson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接