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
)
所以,我遇到了 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
)