如何解决在annotate中使用npc单位
我有一个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单位。我只想知道是否可以在annotate()
中使用npc单位。
有两种相关策略,但并不完全令人满意:
-
一个人可以通过将npc单位指定为
grid::textGrob()
来使用它们。然后,可以像this answer by @baptiste那样用annotation_custom()
放置该grob。但是此解决方案比我想要的要麻烦一些。 -
“ ggpmisc”软件包包括
geom_text_npc()
。但是它与annotate()
doesn't yet work一起使用。也就是说,annotate("text_npc",...)
似乎无效。 [编辑:现在可以使用。请参阅下面的Pedro Aphalo消息。]
也有许多相关的帖子。具体来说,Greg Snow has suggested使用网格创建尺寸为p
的视口,然后为该视口添加注释。还有@teunbrand has suggested一种方法,该方法需要将p
转换为“ gtable”对象(使用ggplotGrob()
),然后绘制该“ gtable”对象。这些策略中的任何一种都可能适合我的目的。但是,有没有更简单的方法将npc坐标与annotate()
一起使用?
解决方法
我个人将使用Baptiste的方法,但将其包装在自定义函数中以使其不那么笨重:
annotate_npc <- function(label,x,y,...)
{
ggplot2::annotation_custom(grid::textGrob(
x = unit(x,"npc"),y = unit(y,label = label,...))
}
您可以这样做:
p + annotate_npc("hello",0.5,0.5)
请注意,这将始终在绘图中每个面板的视口的npc空间中绘制注释(即相对于灰色阴影区域而不是整个绘图窗口),这使得它便于使用。如果要在绝对npc坐标上绘制注释(因此可以选择在面板视口之外进行绘制),则有两个选择:
- 在使用
coord_cartesian(clip = "off")
之前,先关闭annotate
的剪裁,然后根据给定的npc坐标对x,y坐标进行反向工程。这是complicated but possible - 使用
grid
直接绘制。这要容易得多,但缺点是注释必须在图上绘制,而不是成为图本身的一部分。您可以这样:
annotate_npc_abs <- function(label,...)
{
grid::grid.draw(grid::textGrob(
label,x = unit(x,...))
}
语法会有所不同:
p
annotate_npc_abs("hello",0.05,0.75)
,
从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",label = "hello",hjust = "center",vjust = "middle")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。