使用不同数据集时文本相对于绘图区域的一致定位

Consistent positioning of text relative to plot area when using different data sets

我生成了几个图表,其中数据可能具有不同的 xy 范围。我希望在所有绘图中放置一个文本注释,在完全相同的位置 相对于绘图区域

第一个图的示例,其中我使用 annotate 添加文本并使用 xy 以数据为单位定位它:

library(tidyverse)
ggplot(mpg) + 
  geom_point(aes(displ, hwy)) +
  annotate("text", x = 6, y = 20, label = "example watermark", size = 8) +
  ggsave(filename = "mpg.jpg", width = 10, height = 9, dpi = 60)

然后根据另一个数据集创建第二个图,其中 xy 范围与第一个图不同。

无需反复试验,将文本放置在相对于绘图区域完全相同的位置的最佳方法是什么?

ggplot(iris) + 
  geom_point(aes(Petal.Width, Petal.Length)) +
  # I don't want to hardcode x and y in annotate
  # annotate("text", x = 6, y = 20, label = "example watermark", size = 8) +
ggsave(filename = "iris.jpg", width = 10, height = 9, dpi = 60)

您可以使用 annotation_custom。这允许您在绘图 window 的指定坐标处绘制图形对象 (grob)。只需以“npc”为单位指定位置,从左下角的 (0, 0) 到 window:

右上角的 (1, 1)
library(ggplot2)

mpg_plot   <- ggplot(mpg) + geom_point(aes(displ, hwy))
iris_plot  <- ggplot(iris) + geom_point(aes(Petal.Width, Petal.Length))
annotation <- annotation_custom(grid::textGrob(label = "example watermark",
                                               x = unit(0.75, "npc"), y = unit(0.25, "npc"),
                                               gp = grid::gpar(cex = 2)))
mpg_plot  + annotation

iris_plot + annotation

reprex package (v0.3.0)

于 2020 年 7 月 10 日创建

ggpmisc 包有一些方便的函数,其中坐标以 'npc' 图形单位给出。

您可以尝试 geom_text_npc(或其兄弟 geom_label_npc),“旨在用于相对于绘图的物理尺寸定位文本 ".

创建一个geom_text_npc层:

npc_txt = geom_text_npc(aes(npcx = 0.9, npcy = 0.1, label = "some text"), size = 6)

...然后可以添加到所有地块:

ggplot(mpg) + 
  geom_point(aes(displ, hwy)) +
  npc_txt

ggplot(iris) + 
  geom_point(aes(Petal.Width, Petal.Length)) +
  npc_txt


如果您不需要数字 npcxnpcy 提供的坐标精度,您还可以使用“单词”指定一些基本位置(角和中心)(参见 ).在您的示例中,最符合您的数字位置的词是 "right""bottom":

npc_txt = geom_text_npc(aes(npcx = "right", npcy = "bottom", label = "some text"), size = 6)

ggplot(mpg) + 
  geom_point(aes(displ, hwy)) +
  npc_txt

ggplot(iris) + 
  geom_point(aes(Petal.Width, Petal.Length)) +
  npc_txt