我想在条形图中添加一条短水平线。线的左边缘从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")
使用geom_segment()
:
avg.y <- 14.27065
p + geom_bar(stat = "identity") +
geom_segment(aes(x=0, xend=.1, y=avg.y, yend=avg.y))
答案 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()
在回复您的评论时,让我们使用ggplot_build
查看原始图表的基础结构。现在让我们看一下data
的{{1}}元素。请注意,在第一个数据框中,条形图的内部绘图数据,条形图位于x = 1和x = 2。 pb
和xmin
显示条宽的范围。第二个数据框是内部段定位。该段位于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