使用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参数)产生以下图形:
但是,第二个调用(带有size参数)会产生以下图形:
很明显,x轴的宽度增加了!我的问题是,如何以一种通用的方式避免这种情况发生(即,不通过将x轴宽度乘以相对于y轴的0.7)。有什么想法吗?
编辑:
我正在使用ggplot 3.0.0,Windows 10和R 3.5.0
答案 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)
如两个图所示,关闭裁剪将显示两个片段的全宽,这是相同的。
(我还没有充分研究底层代码来回答为什么x方向比y方向削波少的原因,但这似乎是一个相当利基的用例。如果您带注释的线段更靠近绘图中心而不是打sm在其边缘,它们会自动出现相同的尺寸。)
答案 1 :(得分:0)
对于那些可能有帮助的问题,当我使用annotate("segment", ...)
向绘图中添加自定义y轴时,我遇到了同样的问题。 y轴大约是x轴宽度的2/3。我使用coord_cartesian()
设置了x轴限制,该限制默认为clip = "on"
,并且自定义y轴的宽度被裁剪。更改为clip = "off"
对我来说是固定的。