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.5NPC가 단위로. npc 단위 annotate()를 전혀 사용할 수 있는지 알고 싶습니다 .
두 가지 관련 전략이 있지만 완전히 만족 스럽지는 않습니다.
npc 단위를 지정하여 사용할 수 있습니다
grid::textGrob(). 그리고 @baptiste 의이 답변annotation_custom()에서 와 같이 grob 을 배치 할 수 있습니다 . 그러나이 솔루션은 내가 원하는 것보다 조금 더 번거 롭습니다."ggpmisc"패키지에는
geom_text_npc(). 그러나 아직 작동하지 않습니다 와 함께annotate(). 즉,annotate("text_npc", ...)작동하지 않는 것 같습니다. [편집 : 이제 작동합니다. 아래 Pedro Aphalo의 메시지를 참조하십시오.]
관련 게시물도 많이 있습니다. 특히 Greg Snow는 그리드를 사용하여 치수가있는 뷰포트를 p만든 다음 해당 뷰포트에 주석을 달도록 제안했습니다 . 그리고 @teunbrand는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, "npc"), label = label, ...))
}
다음을 수행 할 수 있습니다.
p + annotate_npc("hello", 0.5, 0.5)
이것은 항상 플롯의 각 패널 뷰포트의 npc 공간에 주석을 그릴 것입니다 (즉, 전체 플로팅 창이 아닌 회색 음영 영역을 기준으로 함). 패싯에 편리합니다. 절대 npc 좌표로 주석을 그리려는 경우 (패널의 뷰포트 외부에 플로팅하는 옵션이 있음) 두 가지 옵션은 다음과 같습니다.
coord_cartesian(clip = "off")를 사용하기 전에 지정된 npc 좌표에서 x, y 좌표로 클리핑을 끄고 리버스 엔지니어링하십시오annotate. 이것은되는 수에 불과 복잡- 사용하여 똑바로 그립니다
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)
'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")