ggplot2 - 条与误差线不对齐

ggplot2 - Bars non-aligned to error bars

我正在尝试使用 ggplot2 在 R 中的条上绘制误差线。条形图的位置没问题,但是误差条未对齐,重叠。请看下面的例子:

library(ggplot2)

df = structure(list(variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 4L), .Label = c("Stage1", "Stage2", "Stage3", "Stage4"), class = "factor"), 
    scenario = c("A", "A", "A", "B", "B", 
    "B", "A", "A", "A", "B", "B", 
    "B", "A", "A", "A", "B", "B", 
    "B", "A", "A", "A", "B", "B", 
    "B"), Period = c("2011-2040", "2041-2070", "2071-2100", 
    "2011-2040", "2041-2070", "2071-2100", "2011-2040", "2041-2070", 
    "2071-2100", "2011-2040", "2041-2070", "2071-2100", "2011-2040", 
    "2041-2070", "2071-2100", "2011-2040", "2041-2070", "2071-2100", 
    "2011-2040", "2041-2070", "2071-2100", "2011-2040", "2041-2070", 
    "2071-2100"), value = c(-1, -2, -3, -1, -3, -4, -2, -1, -1, 
    -2, -1, -1, -5, -6, -6, -5, -6, -7, -1, -1, -1, -1, -1, -1
    ), error = c(0.861817443828852, 0.948522930371594, 0.916295430216828, 
    1.09513465405609, 0.967022228830058, 0.962082007787887, 0.327433241996297, 
    0.296270630257992, 0.241564623986049, 0.324799025797241, 
    0.287300168855865, 0.321141699334506, 0.448402583575847, 
    0.329720917851603, 0.296149789779728, 0.423049544646902, 
    0.320807147599275, 0.286926161100617, 0.46555636533774, 0.494769057825624, 
    0.498445009296978, 0.490846868961772, 0.478102139172148, 
    0.47821442683311), ymin = c(-1.86181744382885, -2.94852293037159, 
    -3.91629543021683, -2.09513465405609, -3.96702222883006, 
    -4.96208200778789, -2.3274332419963, -1.29627063025799, -1.24156462398605, 
    -2.32479902579724, -1.28730016885586, -1.32114169933451, 
    -5.44840258357585, -6.3297209178516, -6.29614978977973, -5.4230495446469, 
    -6.32080714759928, -7.28692616110062, -1.46555636533774, 
    -1.49476905782562, -1.49844500929698, -1.49084686896177, 
    -1.47810213917215, -1.47821442683311), ymax = c(-0.138182556171148, 
    -1.05147706962841, -2.08370456978317, 0.0951346540560851, 
    -2.03297777116994, -3.03791799221211, -1.6725667580037, -0.703729369742008, 
    -0.758435376013951, -1.67520097420276, -0.712699831144135, 
    -0.678858300665494, -4.55159741642415, -5.6702790821484, 
    -5.70385021022027, -4.5769504553531, -5.67919285240072, -6.71307383889938, 
    -0.53444363466226, -0.505230942174376, -0.501554990703022, 
    -0.509153131038228, -0.521897860827852, -0.52178557316689
    )), .Names = c("variable", "scenario", "Period", "value", 
"error", "ymin", "ymax"), class = "data.frame", row.names = c(NA, 
-24L))


ggplot(data=df, aes(x=Period, y=value)) +
     geom_bar(aes(fill=variable), position='dodge', stat="identity", width=0.75) +
     geom_errorbar(aes(ymin=ymin, ymax=ymax, width=.2)) +
     facet_wrap(~scenario) +
     theme_bw(base_size=16)

如您所见,误差条未与数据条正确对齐。我也尝试了一些在网上找到的解决方案,例如:

geom_errorbar(aes(ymin=ymin, ymax=ymax), position = position_dodge(0.9)) 

但无济于事。

我的 ggplot 命令有什么问题?

您应该在 ggplot()aes() 中添加 group = variable 以使 position_dodge() 起作用。

ggplot(data=df, aes(x=Period, y=value, group = variable)) +
      geom_bar(aes(fill=variable), position='dodge', stat="identity", width=0.75) +
      geom_errorbar(aes(ymin=ymin, ymax=ymax), position = position_dodge(0.75),width = 0.2) +
      facet_wrap(~scenario) +
      theme_bw(base_size=16)

如果将 fill = variablegeom_bar() 移动到 ggplot()aes(),也可以实现同样的效果。

ggplot(data=df, aes(x=Period, y=value, fill = variable)) +
      geom_bar(position='dodge', stat="identity", width=0.75) +
      geom_errorbar(aes(ymin=ymin, ymax=ymax), position = position_dodge(0.75),width = 0.2) +
      facet_wrap(~scenario) +
      theme_bw(base_size=16)