ggplot:使用geom_segment向右移动条形位置

问题描述 投票:3回答:1

我想在条形图中添加一条短水平线。线的左边缘从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

r ggplot2
1个回答
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查看原始图表的基础结构。现在让我们来看看datapb元素。请注意,在第一个数据框中,条形图的内部绘图数据表示条形图位于x = 1和x = 2。 xminxmax显示条宽的范围。第二个数据框是内部段定位。该段位于x = 0到x = 0.1的位置。因此,在0.1(段的右边缘)和0.45(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
[[1]]
  x        y PANEL group ymin     ymax xmin xmax colour   fill size linetype alpha
1 1 13.02040     1     1    0 13.02040 0.55 1.45     NA grey35  0.5        1    NA
2 2 14.37956     1     2    0 14.37956 1.55 2.45     NA grey35  0.5        1    NA

[[2]]
  x xend        y     yend PANEL group colour size linetype alpha
1 0  0.1 14.27065 14.27065     1    -1    red  0.5        1    NA
2 0  0.1 14.27065 14.27065     1    -1    red  0.5        1    NA
© www.soinside.com 2019 - 2024. All rights reserved.