2012-05-02 46 views
4

我试图创建一个堆叠条形图errorbars *使用GGPLOT2,类似下面的情节: Plot I'm trying to replicate堆积barplot使用errorbars GGPLOT2

我用下面的代码:

df <- data.frame(substrate = gl(6, 2, 12, labels=letters[1:6]), 
       depth = gl(2, 1, 12, labels=c("surf", "deep")), 
       mean = 10 * runif(12), 
       err = runif(12)) 
p <- ggplot(df, aes(x=depth, y=mean, fill=substrate)) + geom_bar(stat="identity") + coord_flip() 
p + geom_errorbar(aes(x=depth, ymin=mean-err, ymax=mean+err)) 

这给了我这样的: enter image description here

它看起来像errorbars的平均值,而不是平均值+“前”衬底的装置的位置的中心。也就是说,错误栏a的中心应该是a的平均值,错误栏b的中心应该是平均值a +平均值b等。

有没有人知道如何使ggplot2发生这种情况?我发现有很好的理论上的理由不以这种方式显示数据 - 但我们并不总是自己决定如何呈现我们的数据!

回答

5

我想你可以用geom_segment做到这一点,但你的例子只有一个方向的酒吧,这似乎更聪明。所以我geom_segment一起黑客攻击的东西:

df <- data.frame(substrate = gl(6, 2, 12, labels=letters[1:6]), 
       depth = gl(2, 1, 12, labels=c("surf", "deep")), 
       mean = 10 * runif(12), 
       err = runif(12)) 
df <- ddply(df,.(depth),transform,ystart = cumsum(mean),yend = cumsum(mean) + err) 
p <- ggplot(df, aes(x=depth, y=mean, fill=substrate)) + 
     geom_bar(stat="identity") 
p + geom_segment(aes(xend = depth,y = ystart,yend = yend)) + 
     geom_point(aes(x = depth,y = yend),shape = "|",show_guide = FALSE) + 
     coord_flip() 

enter image description here

+0

一个方向的酒吧要好得多 - 他们减少条之间重叠的机会。 –