r - 注释绘图边缘而不更改绘图限制或将 "expand"设置为 0

标签 r ggplot2

我有一个 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")

结果如下:

enter image description here

您会看到注释不在图的顶部。相反,与默认的“展开”设置一致,绘图的 y 限制已更改。

可能的解决方案:

  1. 找出默认expand 设置隐含的 y 限制。然后使用 scale_y_continuous() 设置 y 限制并设置 expand = c(0, 0)。这个解决方案将为我提供我想要的 y 限制,并且它将适本地放置标签。我知道如何实现,但似乎有点麻烦。它还会阻止图顶部的其他注释更改绘图的 y 限制 - 而且我不希望该解决方案影响除我在此处描述的注释之外的注释。

  2. 使用 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")

这是输出:

enter image description here

请告诉我这是否是您正在寻找的内容。

关于r - 注释绘图边缘而不更改绘图限制或将 "expand"设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63728991/

相关文章:

ggplot2 - 平滑 geom_ribbon

r - 将数据从长数据更改为矩阵

r - 在R中的数据框列表上应用自定义函数

r - 作为一个list.character?

r - ggplot2:将轴连接到点的线

r - geom_bar 上的定位标签

R:预测组的新值

r - 如果我有一个包含多个列的 DataFrame,我该如何计算超过阈值的变量?

r - 如何理解哪个图例是哪个图例并在 R 的 ggplot 中删除其中一个?

r - 使用ggplot2为树状图中的群集着色