使用不同数据集时文本相对于绘图区域的一致定位
Consistent positioning of text relative to plot area when using different data sets
我生成了几个图表,其中数据可能具有不同的 x
和 y
范围。我希望在所有绘图中放置一个文本注释,在完全相同的位置 相对于绘图区域。
第一个图的示例,其中我使用 annotate
添加文本并使用 x
和 y
以数据为单位定位它:
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)
然后根据另一个数据集创建第二个图,其中 x
和 y
范围与第一个图不同。
无需反复试验,将文本放置在相对于绘图区域完全相同的位置的最佳方法是什么?
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
如果您不需要数字 npcx
和 npcy
提供的坐标精度,您还可以使用“单词”指定一些基本位置(角和中心)(参见 ).在您的示例中,最符合您的数字位置的词是 "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
我生成了几个图表,其中数据可能具有不同的 x
和 y
范围。我希望在所有绘图中放置一个文本注释,在完全相同的位置 相对于绘图区域。
第一个图的示例,其中我使用 annotate
添加文本并使用 x
和 y
以数据为单位定位它:
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)
然后根据另一个数据集创建第二个图,其中 x
和 y
范围与第一个图不同。
无需反复试验,将文本放置在相对于绘图区域完全相同的位置的最佳方法是什么?
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:
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
如果您不需要数字 npcx
和 npcy
提供的坐标精度,您还可以使用“单词”指定一些基本位置(角和中心)(参见 "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