geom_segment size参数在x和y方向上的行为不同

时间:2018-07-04 13:53:01

标签: r ggplot2

使用annotate(geom = "segment")geom_segment绘制水平或垂直线时,我观察到不同的行为。我正在寻找一种使两条线具有相同宽度的方法。下面是一个示例:

library(ggplot2)
data("iris")

# some example graph
g <- ggplot(data = iris, 
            aes(x = Petal.Length, y = Sepal.Length, 
                group = Species, color = Species, shape = Species)) + 
    geom_point(size = 2.5, alpha = .6)

# axes have equal width
g + annotate("segment", x = -Inf, xend = -Inf, y = 2, yend = 8) + 
    annotate("segment", x = 2, xend = 8, y = -Inf, yend = -Inf)

# x-axes increased in size!
g + annotate("segment", x = -Inf, xend = -Inf, y = 2, yend = 8, size = 1) + 
    annotate("segment", x = 2, xend = 8, y = -Inf, yend = -Inf, size = 1)

g + annotate(...的第一次调用(不带size参数)产生以下图形:

enter image description here

但是,第二个调用(带有size参数)会产生以下图形:

enter image description here

很明显,x轴的宽度增加了!我的问题是,如何以一种通用的方式避免这种情况发生(即,不通过将x轴宽度乘以相对于y轴的0.7)。有什么想法吗?

编辑:

我正在使用ggplot 3.0.0,Windows 10和R 3.5.0

2 个答案:

答案 0 :(得分:2)

我可以重现此问题。

但是该段的宽度实际上并没有改变(至少在我的身上没有改变)。我实际上观察到的是将线段对齐到绘图边缘的综合效果,而ggplot的默认裁剪选项隐藏了线段的一部分:

g2 <- g + 
  annotate("segment", x = -Inf, xend = -Inf, y = 2, yend = 8, size = 1) + 
  annotate("segment", x = 2, xend = 8, y = -Inf, yend = -Inf, size = 1) +
  theme(legend.position = "none") # hide legend as it's not relevant here

# convert to grob & turn off clipping for panel layer
g2.grob <- ggplotGrob(g2)
g2.grob$layout$clip[g2.grob$layout$name=="panel"] <- "off"

gridExtra::grid.arrange(g2, g2.grob, nrow = 1)

plot

如两个图所示,关闭裁剪将显示两个片段的全宽,这是相同的。

(我还没有充分研究底层代码来回答为什么x方向比y方向削波少的原因,但这似乎是一个相当利基的用例。如果您带注释的线段更靠近绘图中心而不是打sm在其边缘,它们会自动出现相同的尺寸。)

答案 1 :(得分:0)

对于那些可能有帮助的问题,当我使用annotate("segment", ...)向绘图中添加自定义y轴时,我遇到了同样的问题。 y轴大约是x轴宽度的2/3。我使用coord_cartesian()设置了x轴限制,该限制默认为clip = "on",并且自定义y轴的宽度被裁剪。更改为clip = "off"对我来说是固定的。