如何在ggplot2的条形图上正确获取geom_errorbar来“躲避”?

时间:2018-07-20 13:41:27

标签: r ggplot2

我正在尝试制作带有错误条的分组条形图。但是,我无法使误差线看起来正确(即比主线更细)和正确定位(在线的中心)。 position选项和position_dodge()似乎工作不正常,基于其他类似问题的示例,我也想不出原因。

我正在R版本3.4.2中运行ggplot2 3.0.0版本。

一个最小的工作示例:

d<-data.frame(bin = factor(c(1,2,3,1,2,3)),type = factor(c(1,1,1,2,2,2)), beta = c(10,20,30,40,50,60), se = c(2,2,2,2,2,2))
ggplot(d, aes(x=bin,y=beta,ymin = beta - 1.96* se, ymax = beta+1.96* se)) + 
    geom_bar(aes(fill = type), position = position_dodge2(), stat="identity")  +
    geom_errorbar(position=position_dodge2(.9))

产生:Right Position, Too Wide 位置正确,但是太宽。使用position_dodge()代替position_dodge2()甚至都无法获得正确的位置:

ggplot(d, aes(x=bin,y=beta,ymin = beta - 1.96* se, ymax = beta+1.96* se)) + 
  geom_bar(aes(fill = type), position = position_dodge(), stat="identity")  +
  geom_errorbar(position=position_dodge(.9)) 

Even wider, and wrong positionwidth参数添加到geom_errorbar会中断position_dodge2()的版本,而对position_dodge()的版本无效:

ggplot(d, aes(x=bin,y=beta,ymin = beta - 1.96* se, ymax = beta+1.96* se)) + 
  geom_bar(aes(fill = type), position = position_dodge2(), stat="identity")  +
  geom_errorbar(position=position_dodge2(.9), width= .2)

ggplot(d, aes(x=bin,y=beta,ymin = beta - 1.96* se, ymax = beta+1.96* se)) + 
  geom_bar(aes(fill = type), position = position_dodge(), stat="identity")  +
  geom_errorbar(position=position_dodge(.9), width = .2) 

Good width, wrong position Good width, wrong position still

这是怎么回事?我该如何解决?

1 个答案:

答案 0 :(得分:2)

如果将fill移至全局aes(),则position_dodge()将按预期工作。另外,您可以通过group将分组变量添加到geom_errorbar()

ggplot(d, aes(x = bin, y = beta, 
              ymin = beta - 1.96*se, ymax = beta+1.96*se, fill = type)) + 
    geom_bar(position = position_dodge(), stat="identity")  +
    geom_errorbar(position=position_dodge(.9), width = .2)

position_dodge2()的问题似乎是this GitHub issue中讨论的问题,可以通过padding参数解决。请注意,使用这种方法,width中不再有geom_errorbar()自变量。

ggplot(d, aes(x = bin, y = beta, 
              ymin = beta - 1.96*se, ymax = beta+1.96*se, fill = type)) + 
    geom_bar(position = position_dodge2(), stat="identity")  +
    geom_errorbar(position = position_dodge2(.9, padding = .6))