ggplot:使用geom_segment向右移动柱头位置

时间:2017-12-17 00:43:46

标签: r ggplot2

我想在条形图中添加一条短水平线。线的左边缘从y轴开始,右边缘延伸到绘图表面。该线表示y轴变量的平均值。我使用geom_segment()添加了该行,但这会将条的位置向右移动。
如何在不移动条形位置的情况下添加线条?

另外,为什么会这样?几乎看起来geom_segment()占据渲染表面的某个区域,而不是在现有图形的顶部打印。

示例数据框:

df
      x        y
1 FALSE 13.02041
2  TRUE 14.37956  

没有geom_segment()

p <- ggplot(df, aes(x=x, y=y))
p + geom_bar(stat = "identity")

without line

使用geom_segment()

avg.y <- 14.27065
p + geom_bar(stat = "identity") + 
    geom_segment(aes(x=0, xend=.1, y=avg.y, yend=avg.y)) 

with line

1 个答案:

答案 0 :(得分:3)

在条形图中,条形(隐含地)以1和2为中心,并在任一方向上延伸约+/- 0.45。因此,您可以更改细分的x范围,使其位于您想要的位置。

ggplot(df, aes(x, y)) +
  geom_bar(stat="identity") +
  geom_segment(aes(x=0.5, xend=2.5, y=avg.y, yend=avg.y), colour="red") +
  theme_bw() 

enter image description here

在回复您的评论时,让我们使用ggplot_build查看原始图表的基础结构。现在让我们看一下data的{​​{1}}元素。请注意,在第一个数据框中,条形图的内部绘图数据,条形图位于x = 1和x = 2。 pbxmin显示条宽的范围。第二个数据框是内部段定位。该段位于x = 0到x = 0.1的位置。因此,在0.1(段的右边缘)和0.45(xmax栏的左边缘)之间没有任何内容,这可以在您在问题中发布的第二个图中看到。

FALSE
p = ggplot(df, aes(x, y)) +
  geom_bar(stat="identity") +
  geom_segment(aes(x=0, xend=0.1, y=avg.y, yend=avg.y))

pb = ggplot_build(p)
pb$data