【发布时间】:2020-09-04 05:58:33
【问题描述】:
我有一个 ggplot 对象。我想用annotate()在绘图的顶部添加一个标签,这样标签的上边缘也是绘图的上边缘。使用默认设置时,这似乎是不可能的:在绘图的上边缘添加注释会导致 y 上限增加。
可以通过在创建绘图时指定scale_y_continuous(expand = c(0, 0)) 来解决此问题。但我不想这样做,部分原因是我喜欢默认 expand 设置创建的 y 限制。鉴于此约束,是否可以使用annotate() 将标签放置在图的顶部?
这是一个演示问题的最小示例:
library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
yMax <- layer_scales(p)$y$range$range[2] # upper y-limit
p + annotate("label", x = 30, y = yMax, vjust = "top", label = "X")
结果如下:
您会看到注释不在图的顶部。相反,与默认的“展开”设置一致,绘图的 y 限制发生了变化。
可能的解决方案:
-
找出默认
expand设置隐含的 y 限制。然后使用scale_y_continuous()设置y 限制并设置expand = c(0, 0)。此解决方案将为我提供所需的 y 限制,并将适当放置标签。我知道如何实现它,但它似乎有点麻烦。它还会阻止图顶部的其他注释更改绘图的 y 限制 - 我不希望解决方案影响我在此处描述的注释之外的注释。 -
使用
annotation_custom(),它不会以相同的方式更改绘图限制。 @baptiste 在this answer to a different question 中提出了类似的解决方案。但是annotation_custom()需要一个 grob。在实践中,我使用的注释可能比本示例中的标签更复杂,而且我并不总是知道如何将它们创建为可以传递给annotation_custom()的 grob。此外,我在使用annotation_custom()定位 grobs 时遇到了一些麻烦,同时还要指定它们的确切大小。
也就是说,我对基于annotation_custom() 的解决方案持开放态度。除了我上面概述的两个之外,也许还有其他解决方案。
我已经阅读了许多关于更改情节限制的 SO 帖子,但我没有发现任何与此问题相关的帖子。
【问题讨论】: