使用npc单元在annotate()中。

5
我有一个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 单位。我只想知道是否可以在 annotate() 中使用 npc 单位。
有两种相关策略,但它们并不完全令人满意:
  1. 可以通过将npc单位指定为 grid::textGrob() 的参数来使用npc单位。然后可以使用 annotation_custom() 将grob放置在特定位置,例如 @baptiste的这个回答。但是,这种解决方案比我想要的更加繁琐。

  2. "ggpmisc"包包含 geom_text_npc()。但是它目前还不能与annotate()一起使用。也就是说,annotate("text_npc", ...)似乎不起作用。[编辑:现在已经可以使用了。请参见Pedro Aphalo下面的信息。]

还有许多相关的文章。特别地,Greg Snow建议使用网格(grid)创建具有p尺寸的视口(viewport),然后注释该视口。而@teunbrand建议一种方法是将p转换为“gtable”对象(使用ggplotGrob()),然后绘制该“gtable”对象。这两种策略都可能适用于我的目的。但是否有更直接的方法使用npc坐标与annotate()?


1
谢谢您的反馈。我已经在'ggpmisc'包中添加了一些分钟前的annotate()函数。这个新的annotate()函数覆盖了原始定义,增加了对npcx和npcy位置审美的支持。我将在几天内提交到CRAN。同时,该代码也可从Bitbucket获取(请注意,由于历史原因,当前的主分支称为“no-debug”)。这使得annotate("text_npc", ...)可以使用。 - Pedro J. Aphalo
那是个好消息。谢谢你提供这个包裹和更新。 - user697473
1
刚刚更新的“ggpmisc”版本0.3.6已被CRAN接受。尽管从源代码进行更新应该会更快,但二进制文件仍需要几天时间才能变得可用。 - Pedro J. Aphalo
2个回答

11

个人而言,我会使用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)

enter image description here

请注意,这将始终在绘图中每个面板的视口的npc空间中绘制您的注释(即相对于灰色阴影区域而不是整个绘图窗口),这使得它对于分面非常方便。如果您想在绝对npc坐标系中绘制注释(因此您可以选择绘制面板视口之外),则有两个选项:
1.使用coord_cartesian(clip =“off”)关闭剪辑并从给定的npc坐标反向工程x,y坐标,然后再使用annotate。这是复杂但可行的
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)

enter image description here


3

自“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")

好的提示!这让我了解到ggpp包中的geom_text_npcggpmisc的姊妹包)。 - solarchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接