我有一个ggplot对象。我想用annotate()添加一些文本,我想在npc单元中指定文本的坐标。这个是可能的吗?
这个最小的示例演示了文本通常如何使用annotate()定位。
library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + annotate("text", x = 30, y = 4.5, label = "hello")我希望达到同样的效果,但我不想在本机坐标中指定x和y,而是用npc坐标指定它们。就本例而言,我并不担心将x = 30和y = 4.5准确地转换为npc单元。我只想知道npc单元是否可以在annotate()中使用。
有两种相关的策略,但它们并不完全令人满意:
grid::textGrob()。然后可以将grob与annotation_custom()放在一起,就像在巴普蒂斯特的回答中一样。但是这个解决方案比我想要的要麻烦一些。geom_text_npc()。但它与还不起作用和annotate()。也就是说,annotate("text_npc", ...)似乎不起作用。编辑:它现在起作用了。请看下面佩德罗·阿法罗的留言。还有许多相关职位。特别是,格雷格·斯诺建议使用网格创建一个具有p维度的视口,然后对该视图端口进行注释。@teunbrand建议是一种方法,它需要将p转换为"gtable“对象(使用ggplotGrob()),然后绘制该"gtable”对象。这两种策略中的任何一种都可能适合我的目的。但是有更简单的方法来使用npc坐标和annotate()吗?
发布于 2020-09-04 13:31:22
就我个人而言,我会使用巴普蒂斯特的方法,但是封装在一个自定义函数中,使它不那么笨重:
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)

注意,这将始终在绘图中每个面板的视口的npc空间中绘制注释(即相对于灰色阴影区域,而不是整个绘图窗口),这使得它方便于面。如果您想要在绝对npc协调中绘制您的注释(因此您可以选择在面板的视图之外绘制),那么您的两个选项是:
coord_cartesian(clip = "off")关闭剪裁,并在使用annotate之前从给定的npc协调器反向工程x,y坐标。我是复杂但可能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)

发布于 2020-09-10 17:20:49
截至'ggpmisc‘(>= 0.3.6),以下代码按预期工作(截至2020年-09-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")https://stackoverflow.com/questions/63741925
复制相似问题