【问题标题】:use npc units in annotate()在 annotate() 中使用 npc 单位
【发布时间】:2020-12-23 18:30:25
【问题描述】:

我有一个 ggplot 对象。我想用annotate()添加一些文字,我想以npc单位指定文字的坐标。这可能吗?

这个最小的例子演示了文本通常是如何用annotate()定位的:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + annotate("text", x = 30, y = 4.5, label = "hello")

我想达到同样的效果,但不是在原生坐标中指定xy,我想用npc 坐标指定它们。出于本示例的目的,我并不担心将 x = 30y = 4.5 准确地转换为 npc 单位。我只想知道npc单位是否可以在annotate()中使用。

有两种相关的策略,但并不完全令人满意:

  1. 可以通过将 npc 单位指定为 grid::textGrob() 来使用它们。然后可以使用annotation_custom() 放置grob,如this answer by @baptiste。但是这个解决方案比我想的要麻烦一些。

  2. “ggpmisc”包包括geom_text_npc()。但是doesn't yet workannotate()。也就是说,annotate("text_npc", ...) 似乎不起作用。 [编辑:它现在可以工作了。请参阅下面 Pedro Aphalo 的消息。]

还有很多相关的帖子。特别是,Greg Snow has suggested 使用网格创建尺寸为p 的视口,然后对该视口进行注释。而@teunbrand has suggested 一种方法需要将p 转换为“gtable”对象(使用ggplotGrob()),然后绘制该“gtable”对象。这些策略中的任何一个都可能适合我的目的。但是有没有更直接的方法来使用 annotate() 的 npc 坐标?

【问题讨论】:

  • 感谢您报告此事。我在几分钟前添加了函数annotate() 来打包'ggpmisc'。这个新的annotate() 覆盖了原始定义,增加了对 npcx 和 npcy 位置美学的支持。几天后我将提交给 CRAN。同时,代码可从 Bitbucket 获得(请注意,由于历史原因,当前的主分支称为“无调试”)。这使得annotate("text_npc", ...) 可用。
  • 这是个好消息。感谢您的软件包和此次更新。
  • 更新的 'ggpmisc' 版本 0.3.6 已在几分钟前被 CRAN 接受。二进制文件仍然需要几天的时间才能可用,而从源代码更新应该可以更快。

标签: r ggplot2 grid coordinates ggpmisc


【解决方案1】:

从 'ggpmisc' (>= 0.3.6) 开始,以下代码按预期工作(截至 2020 年 9 月 10 日在 CRAN 中)。

library(ggpmisc)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
# default justification is "inward"
p + annotate("text_npc", npcx = 0.8, npcy = 0.75, label = "hello")
# same justification as default for "geom_text()"
p + annotate("text_npc", npcx = 0.8, npcy = 0.75, label = "hello",
             hjust = "center", vjust = "middle")

【讨论】:

    【解决方案2】:

    就个人而言,我会使用 Baptiste 的方法,但将其包裹在自定义函数中以使其不那么笨重:

    annotate_npc <- function(label, x, y, ...)
    {
      ggplot2::annotation_custom(grid::textGrob(
        x = unit(x, "npc"), y = unit(y, "npc"), label = label, ...))
    }
    

    您可以这样做:

    p + annotate_npc("hello", 0.5, 0.5)
    

    请注意,这将始终在绘图中每个面板的视口的 npc 空间中绘制您的注释(即相对于灰色阴影区域而不是整个绘图窗口),这使得它对构面很方便。如果您想在绝对 npc 坐标中绘制注释(因此您可以选择在面板视口之外进行绘图),您的两个选项是:

    1. 使用coord_cartesian(clip = "off") 关闭剪裁,并在使用annotate 之前对给定npc 坐标的x、y 坐标进行逆向工程。这是complicated but possible
    2. 使用grid 直接绘制它。这要容易得多,但缺点是必须在绘图上绘制注释,而不是作为绘图本身的一部分。你可以这样做:
    annotate_npc_abs <- function(label, x, y, ...) 
    {
      grid::grid.draw(grid::textGrob(
        label, x = unit(x, "npc"), y = unit(y, "npc"), ...))
    }
    

    而且语法会有点不同:

    p 
    annotate_npc_abs("hello", 0.05, 0.75)
    

    【讨论】:

      猜你喜欢
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 2022-12-29
      • 2019-11-17
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多