geom_text() 位置随轴跨度或长度不同而变化,如何保持固定?

geom_text() position change with different axis span or length, how to keep it fixed?

所以,我遇到了 ggplot2 的问题 geom_text()。我找不到解决方案,所以我想在这里问一下。我注意到以下内容:

library("ggplot2")
dev.new()

ggplot(mtcars, aes(x=mpg, y=hp)) +
    geom_point() +
    geom_text(label=rownames(mtcars), nudge_x=5, nudge_y=5) 
    
mtcars_mod <- rbind.data.frame(mtcars, c(80, 6, 123.0, 111, 5.14, 1.7, 22.1, 2, 1, 3, 1))
rownames(mtcars_mod) <- c(rownames(mtcars), "Fake Car")


dev.new()

ggplot(mtcars_mod, aes(x=mpg, y=hp)) +
    geom_point() +
    geom_text(label=rownames(mtcars_mod), nudge_x=5, nudge_y=5)

通过运行这段代码,我得到了两个不同的图。它们是不同的,因为在第二个 table (mtcars_mod) 中我添加了一个 Fake Car 这是一个异常值并且完全改变了 x 轴的跨度,如果比较到第一个情节。

问题是,如果我对两个图使用相同的 nudge,我得到的是标记点,相对于点本身,这些标记位于不同的位置。事实上,轴的比例似乎正在影响标签的位置,相对于点的位置。我希望我传递给 nudge 的值以某种方式知道情节的规模,但看起来不是,对吧?所以我的问题是:无论 x and/or y 轴发生什么变化,有没有一种方法可以在不同的图上,在相同的位置,相对于点显示标签?

一种选择是使用 ggtext::geom_richtext。与以比例单位测量并受数据范围影响的微移相反,ggtext::geom_richtext 允许通过以“mm”或“pt”等单位设置边距来“移动”标签。因此标签和数据点之间的距离以绝对单位固定并且与比例无关。默认情况下 geom_richtext 类似于 geom_label 所以我将 fill 和标签轮廓又名 label.colour 设置为 NA 以摆脱标签周围绘制的框。

library(ggplot2)
library(ggtext)

mtcars_mod <- rbind.data.frame(mtcars, c(80, 6, 123.0, 111, 5.14, 1.7, 22.1, 2, 1, 3, 1))
rownames(mtcars_mod) <- c(rownames(mtcars), "Fake Car")

ggplot(mtcars, aes(x = mpg, y = hp)) +
  geom_point() +
  geom_richtext(
    label = rownames(mtcars),
    label.margin = unit(c(0, 0, 5, 5), "mm"),
    hjust = 0,
    fill = NA, label.colour = NA
  )

ggplot(mtcars_mod, aes(x = mpg, y = hp)) +
  geom_point() +
  geom_richtext(
    label = rownames(mtcars_mod),
    label.margin = unit(c(0, 0, 5, 5), "mm"),
    hjust = 0,
    fill = NA, label.colour = NA
  )