如何使geom_bar中的闪避与geom_errorbar,geom_point中的闪避一致

时间:2012-10-24 13:40:36

标签: r plot ggplot2

我有一个数据集,可以在不同的日期对不同的群体进行测量。

我希望并排显示不同日期的不同日期测量结果,并根据测量日间间隔条形图,并将误差范围叠加在上面。

我在geom_bar geom_errorbar同意躲闪days = data.frame(day=c(0,1,8,15)); groups = data.frame(group=c("A","B","C","D", "E"), means=seq(0,1,length=5)); my_data = merge(days, groups); my_data$mid = exp(my_data$means+rnorm(nrow(my_data), sd=0.25)); my_data$sigma = 0.1; png(file="bar_and_errors_example.png", height=900, width=1200); plot(ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) + geom_bar (position=position_dodge(width=0.5)) + geom_errorbar (position=position_dodge(width=0.5), colour="black") + geom_point (position=position_dodge(width=0.5), aes(y=mid, colour=group))); dev.off(); 时遇到麻烦。

这是一段简单的代码:

geom_bar

在图中,错误显示与其条形图有一个固定的偏移量(抱歉,即使ggplot2是主题,也不允许新手使用图表)。

geom_errorbar中调整binwidth时,偏移量不固定,每天都会发生变化。

请注意,geom_pointgeom_bar同时躲闪。 如何让{{1}}同意其他两个?

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:18)

对齐问题部分是由于您的条形图未表示您想要的数据。以下排列正确:

ggplot(my_data, aes(x=day, weight=mid, ymin=mid-sigma, ymax=mid+sigma, fill=group)) +
     geom_bar      (position=position_dodge(), aes(y=mid), stat="identity") +
     geom_errorbar (position=position_dodge(width=0.9), colour="black") +
     geom_point    (position=position_dodge(width=0.9), aes(y=mid, colour=group))

enter image description here

答案 1 :(得分:4)

第一个更改我根据advanced R style guide重新格式化了代码。

days <- data.frame(day=c(0,1,8,15))

groups <- data.frame(
    group=c("A","B","C","D", "E"), 
    means=seq(0,1,length=5)
    )

my_data <- merge(days, groups)

my_data$mid <- exp(my_data$means+rnorm(nrow(my_data), sd=0.25))
my_data$sigma <- 0.1

现在,当我们查看数据时,我们发现那一天是一个因素,其他一切都是相同的。

str(my_data)

要从图中删除空格,我将日期列转换为因子。在继续之前检查水平是否正确。

my_data$day <- as.factor(my_data$day) 
levels(my_data$day)

我做的下一个更改是在aes个参数中定义y。我确信你知道,这让ggplot知道在哪里寻找y值。然后我将位置参数更改为“闪避”并添加了stat="identity"参数。 "identity"参数告诉g​​gplot在y处绘制y。 geom_errorbargeom_bar继承了闪避位置,因此您可以不指定,但geom_point不会,因此您必须指定该值。默认躲闪是position_dodge(.9)

ggplot(data = my_data, 
 aes(x=day,
     y= mid, 
     ymin=mid-sigma, 
     ymax=mid+sigma,       
     fill=group)) +
   geom_bar(position="dodge", stat = "identity") + 
   geom_errorbar( position = position_dodge(), colour="black") +
   geom_point(position=position_dodge(.9), aes(y=mid, colour=group))

enter image description here

答案 2 :(得分:4)

这是一个老问题,但由于我今天遇到了问题,我想添加以下内容:

 geom_bar(position = position_dodge(width=0.9), stat = "identity") + 
   geom_errorbar( position = position_dodge(width=0.9), colour="black") 
width中的position_dodge - 参数控制着相互躲避的东西的躲避宽度。然而,这会产生与棒一样宽的晶须,这可能是不希望的。 position_dodge外的另一个width-argument控制着胡须(和条形)的宽度:

 geom_bar(position = position_dodge(width=0.9), stat = "identity", width=0.7) + 
   geom_errorbar( position = position_dodge(width=0.9), colour="black", width=0.3) 

答案 3 :(得分:1)

有时您将aes(x=tasks,y=val,fill=group)放在geom_bar中,而不是ggplot中。这是由于ggplot向前x并根据每个组的位置指定它而引起的问题。