有没有办法在 ggplot 中添加图层而不影响尺度的训练,或者至少不影响尺度的限制?
我正在处理的用例是我想要包含参考线,但仅当数据自然包含该线时才需要它。如果其余数据不需要它,我不希望扩展比例以包含该行。
举个例子
library("ggplot2")
g <- ggplot(data = mtcars, aes(x=mpg, y=hp)) + geom_point()
Run Code Online (Sandbox Code Playgroud)
添加 250 马力的参考线。
g + geom_hline(yintercept = 250)
Run Code Online (Sandbox Code Playgroud)
如果我将数据更改为不沿 y 轴延伸那么远的数据,则 y 轴将扩展以包含水平线。
(g + geom_hline(yintercept = 250)) %+% mtcars[mtcars$cyl < 8,]
Run Code Online (Sandbox Code Playgroud)
我想要的是在图层中指定geom_hline在确定 y 比例限制时不应使用的某种方法。适用于任何几何/图层的东西将是最好的。结果应该看起来像
g %+% mtcars[mtcars$cyl < 8,]
Run Code Online (Sandbox Code Playgroud)
我知道我可以手动设置 y 轴限制。但这并不能解决我的一般问题,因为我不知道如果没有附加的水平线层,轴的限制会是多少。
我认为这应该是可能的。在文档的示例layer_spatial中,它提到annotation_spatial“层不训练尺度,因此数据保持中心”,但我没有找到概括这一点的方法。
我已经看到了问题ggplot2:添加几何图形而不影响限制,这是相同的一般问题,但由于缩放了层内的值,所以答案特定于添加的层。
您可以annotation_custom用 a (不会训练音阶)代替geom_hline。在你的情况下,它将是:
g <- g + annotation_custom(
grid::linesGrob(y = unit(c(0, 0), "npc")), ymin = 250, ymax = 250)
Run Code Online (Sandbox Code Playgroud)
所以现在:
g
Run Code Online (Sandbox Code Playgroud)
但
g %+% mtcars[mtcars$cyl < 8,]
Run Code Online (Sandbox Code Playgroud)