【问题标题】:annotate edge of plot without changing plot limits or setting "expand" to 0注释绘图边缘而不更改绘图限制或将“扩展”设置为 0
【发布时间】: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 限制发生了变化。

可能的解决方案:

  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() 的解决方案持开放态度。除了我上面概述的两个之外,也许还有其他解决方案。

我已经阅读了许多关于更改情节限制的 SO 帖子,但我没有发现任何与此问题相关的帖子。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    一个简单的解决方案是设置 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")
    

    这是输出:

    如果这就是你要找的,请告诉我。

    【讨论】:

    • 谢谢。我不知道Inf 可以用来防止我在帖子中描述的情节扩展行为。
    【解决方案2】:

    这有帮助吗?

    library(ggplot2)
    
    data(mtcars)
    
    ggplot(mtcars, aes(mpg, wt)) +
      geom_point() +
      geom_text(label = "X", x = 30, y = max(mtcars$wt))
    

    【讨论】:

    • 谢谢——但它不太正确。如果您运行代码,您会看到以这种方式定位标签会增加绘图的 y 上限。因此,标签不会位于绘图的顶部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多