首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在注释()中使用npc单元

在注释()中使用npc单元
EN

Stack Overflow用户
提问于 2020-09-04 13:12:57
回答 2查看 922关注 0票数 4

我有一个ggplot对象。我想用annotate()添加一些文本,我想在npc单元中指定文本的坐标。这个是可能的吗?

这个最小的示例演示了文本通常如何使用annotate()定位。

代码语言:javascript
复制
library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p + annotate("text", x = 30, y = 4.5, label = "hello")

我希望达到同样的效果,但我不想在本机坐标中指定xy,而是用npc坐标指定它们。就本例而言,我并不担心将x = 30y = 4.5准确地转换为npc单元。我只想知道npc单元是否可以在annotate()中使用。

有两种相关的策略,但它们并不完全令人满意:

  1. 可以通过指定npc单元来使用npc单元,比如grid::textGrob()。然后可以将grob与annotation_custom()放在一起,就像在巴普蒂斯特的回答中一样。但是这个解决方案比我想要的要麻烦一些。
  2. "ggpmisc“包包括geom_text_npc()。但它与还不起作用annotate()。也就是说,annotate("text_npc", ...)似乎不起作用。编辑:它现在起作用了。请看下面佩德罗·阿法罗的留言。

还有许多相关职位。特别是,格雷格·斯诺建议使用网格创建一个具有p维度的视口,然后对该视图端口进行注释。@teunbrand建议是一种方法,它需要将p转换为"gtable“对象(使用ggplotGrob()),然后绘制该"gtable”对象。这两种策略中的任何一种都可能适合我的目的。但是有更简单的方法来使用npc坐标和annotate()吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-04 13:31:22

就我个人而言,我会使用巴普蒂斯特的方法,但是封装在一个自定义函数中,使它不那么笨重:

代码语言:javascript
复制
annotate_npc <- function(label, x, y, ...)
{
  ggplot2::annotation_custom(grid::textGrob(
    x = unit(x, "npc"), y = unit(y, "npc"), label = label, ...))
}

这样你就可以做:

代码语言:javascript
复制
p + annotate_npc("hello", 0.5, 0.5)

注意,这将始终在绘图中每个面板的视口的npc空间中绘制注释(即相对于灰色阴影区域,而不是整个绘图窗口),这使得它方便于面。如果您想要在绝对npc协调中绘制您的注释(因此您可以选择在面板的视图之外绘制),那么您的两个选项是:

  1. 使用coord_cartesian(clip = "off")关闭剪裁,并在使用annotate之前从给定的npc协调器反向工程x,y坐标。我是复杂但可能
  2. grid直接画出来。这要容易得多,但缺点是注释必须绘制在情节上,而不是作为情节本身的一部分。你可以这样做:
代码语言:javascript
复制
annotate_npc_abs <- function(label, x, y, ...) 
{
  grid::grid.draw(grid::textGrob(
    label, x = unit(x, "npc"), y = unit(y, "npc"), ...))
}

语法也会有一点不同:

代码语言:javascript
复制
p 
annotate_npc_abs("hello", 0.05, 0.75)

票数 9
EN

Stack Overflow用户

发布于 2020-09-10 17:20:49

截至'ggpmisc‘(>= 0.3.6),以下代码按预期工作(截至2020年-09-10年在CRAN中)。

代码语言:javascript
复制
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")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63741925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档