2017-12-21 12 views
1

ggplot에서 일부 그래프를 작성 중이며 x 및 x를 지정하지 않고 그래프 텍스트로 플롯하는 방법을 알아낼 수 없습니다. y 위치.ggplot2 기존의 "위쪽", "아래쪽", "왼쪽", "오른쪽", "중앙"으로 geom_text 위치 지정

이렇게 그래프를 만들 것이라고합시다.

sp <- ggplot(mpg, aes(hwy, cty, label = "sometext"))+ 
    geom_point() 

모든 그래프에서 동일한 방식으로 인쇄 할 레이블을 추가하고 싶습니다. 다음을 호출하면 aes에 제공된 x, y 값마다 텍스트가 인쇄됩니다.

sp + geom_text() 

나는 텍스트가 그래프 사이의 상대적으로 동일한 위치에 남아 있도록 geom_text()에 공급되는 XY 데이터를 조작하지만, "최고", "아래"와 같은 기본 위치로 위치를 호출 할 수있는 간단 방법이없는 수 기타? 나는. sp + geom_text(position="top").

답변

2

geom_text은 데이터 세트를 기반으로 레이블을 표시하려고합니다. 플롯에 하나의 텍스트를 추가하려고하는 것 같습니다.이 경우 annotate이 더 나은 옵션입니다.

sp <- ggplot(mpg, aes(hwy, cty, label = "sometext"))+ 
    geom_point() + 
    annotate(geom = 'text', label = 'sometext', x = -Inf, y = Inf, hjust = 0, vjust = 1) 
print(sp) 

enter image description here

2

내가 전염병처럼 annotate 방지하고 그냥 빈 데이터를 사용에 관계없이 플롯의 단위의 동일한 위치에 표시 할 레이블을 강제하려면 Inf 값을 이용할 수 있습니다 프레임 geom_text에 대한 data 인수 :

ggplot(mpg, aes(hwy, cty, label = "sometext"))+ 
    geom_point() + 
    geom_text(data=data.frame(), aes(label = 'sometext', x = -Inf, y = Inf), 
      hjust = 0, vjust = 1) 
+0

영리한 아이디어를 가능 빈 data.frame. 주석을 피하는 이유는 무엇입니까? – CCurtis

+1

텍스트 요소에 중점을 둡니다. 그리드 운영체제 (esp를 목표로 함)로 포스트를 플롯하는 것이 더 쉽습니다.하지만 여유 시간에는 ggplot2를 많이 사용하므로 많은 사람들이 그렇게하지 않습니다. 장기적으로, 나는 대개 패싯을 다르게 주석 처리해야하며 결국 주석을 사용한 것을 잊지 않고 vs를 추가 할 수 있습니다. 단지 개인적인 취지. – hrbrmstr

+0

패싯이 작동하게되면'annotate '는 작동하기가 어려워서 보통 데이터 프레임과'geom_text'에 의존합니다. 그러나 이와 같은 간단한 경우에는'annotate '가 더 분명한 선택입니다. – jdobres

1

솔루션 사용하여 무한대의 좋은 확실히 가장 쉬운 방법입니다.

그러나 라벨의 위치를보다 세부적으로 제어하려는 경우 (예 : 가운데 맞춤을 원하거나 축선과 주석 사이에 더 많은 공간이 필요한 경우) min()max()과 함께 일부 수학을 사용할 수 있습니다 아래, 오른쪽 또는 왼쪽에 가운데 맞춤 제목을 만들 수 있습니다. 아래의 코드는 약간 길지만 플롯의 값이 바뀌면 레이블을 올바르게 배치합니다. 또한 다른 플롯으로 복사하려면 값을 수동으로 계산할 필요가 없으며 x 및 y 변수의 이름 만 변경하면됩니다.

sp <- ggplot(mpg, aes(hwy, cty)) + 
    geom_point() + 
    theme_classic() + 
    annotate("text", label = "top", 
      x = 0.5*(min(mpg$hwy) + max(mpg$hwy)), y = max(mpg$cty), vjust = 1) + 
    annotate("text", label = "bottom", 
      x = 0.5*(min(mpg$hwy) + max(mpg$hwy)), y = min(mpg$cty), vjust = 0) + 
    annotate("text", label = "right", 
      x = max(mpg$hwy), y = 0.5*(min(mpg$cty) + max(mpg$cty)), hjust = 1) + 
    annotate("text", label = "left", 
      x = min(mpg$hwy), y = 0.5*(min(mpg$cty) + max(mpg$cty)), hjust = 0) 

sp 

enter image description here

+0

답변 해 주셔서 감사합니다.나는 분명하지 않을 수도 있지만 이것은 "x y 데이터 조작"이 의미하는 바입니다. 당신이 그것을하는 것을 볼 수 있지만, 나는 정말로 그 모든 많은 노력을 깨닫게하지 않습니다. "맨 아래"등의 인수에 응답하는 함수로 감싸면 멋질 수 있습니다. – CCurtis

1

library(ggplot2) 

qplot(1,1) + 
    annotation_compass('testN') + 
    annotation_compass('testE','E') + 
    annotation_compass('testSW','SW') + 
    annotation_compass('testW','W') 

enter image description here

annotation_compass <- function(label, 
           position = c('N','NE','E','SE','S','SW','W','NW'), 
           padding = grid::unit(c(0.5,0.5),"line"), ...){ 
    position <- match.arg(position) 
    x <- switch (position, 
    N = 0.5, 
    NE = 1, 
    E = 1, 
    SE = 1, 
    S = 0.5, 
    SW = 0, 
    W = 0, 
    NW = 0 
) 
    y <- switch (position, 
       N = 1, 
       NE = 1, 
       E = 0.5, 
       SE = 0, 
       S = 0, 
       SW = 0, 
       W = 0.5, 
       NW = 1 
) 
    hjust <- switch (position, 
       N = 0.5, 
       NE = 1, 
       E = 1, 
       SE = 1, 
       S = 0.5, 
       SW = 0, 
       W = 0, 
       NW = 0 
) 
    vjust <- switch (position, 
       N = 1, 
       NE = 1, 
       E = 0.5, 
       SE = 0, 
       S = 0, 
       SW = 0, 
       W = 0.5, 
       NW = 1 
) 
    f1 <- switch (position, 
        N = 0, 
        NE = -1, 
        E = -1, 
        SE = -1, 
        S = 0, 
        SW = 1, 
        W = 1, 
        NW = 1 
) 
    f2 <- switch (position, 
        N = -1, 
        NE = -1, 
        E = 0, 
        SE = 1, 
        S = 1, 
        SW = 1, 
        W = 0, 
        NW = -1 
) 
    annotation_custom(grid::textGrob(label, 
            x=grid::unit(x,"npc") + f1*padding[1] , 
            y=grid::unit(y,"npc") + f2*padding[2], 
            hjust=hjust,vjust=vjust, ...)) 
} 
, 오히려 상세하게 정의되어 래퍼하지만 방법 단위와 정당성을 작성 확실히 공급