我有一个 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()
的解决方案非常开放。除了我上面概述的两个之外,也许还有其他解决方案。
我读过很多关于改变绘图限制的帖子,但我还没有找到任何涉及这个问题的帖子。
最佳答案
一个简单的解决方案是设置 y = Inf
而不是使用 y 轴的最大值 (yMax
)。代码将是这样的:
# load library
library(ggplot2)
# load data
data(mtcars)
# define plot
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + annotate("label", x = 30, y = Inf, vjust = "top", label = "X")
这是输出:
请告诉我这是否是您正在寻找的内容。
关于r - 注释绘图边缘而不更改绘图限制或将 "expand"设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63728991/