ggplot을 사용하여 플롯을 만들 때 hjust와 vjust는 무엇을합니까?


159

ggplot을 사용하여 플롯을 만들 때마다 hjust와 vjust에 대해 다른 값을 시도하는 동안 약간의 시간을 소비합니다.

+ opts(axis.text.x = theme_text(hjust = 0.5))

축 레이블이 축과 거의 닿는 위치에 정렬되고 축과 맞 닿아있는 위치 (축에 맞게 정렬 됨)를 정렬합니다. 그러나 나는 무슨 일이 일어나고 있는지 정말로 이해하지 못한다. 종종, hjust = 0.5에서와 같은 극적으로 다른 결과를 얻을 수 있습니다 hjust = 0.6예를 들어, 내가 그것을 알아낼 수 없었던 것을 단지 다른 값으로 장난에 의해.

누구든지 hjust 및 vjust 옵션의 작동 방식에 대한 포괄적 인 설명을 알려줄 수 있습니까?


1
첫 번째 답변에 대한 의견에서 구체적인 예를 들었습니다. 0-1 이외의 숫자를 사용하는 것은 분명하지 않으며, hjust = -1이 기괴한 동작을하는 이유를 설명하지 않으면 기괴한 것이 예상된다는 것을 적어도 설명합니다.
William Gunn

답변:


277

hjust및 의 값은 vjust0과 1 사이에서만 정의됩니다.

  • 0은 왼쪽 정렬됨을 의미합니다
  • 1은 오른쪽 정렬됨을 의미합니다

출처 : ggplot2, Hadley Wickham, 196 페이지

(예, 대부분의 경우이 범위를 넘어서 사용할 수는 있지만 특정 방식으로 작동 할 것으로 기대하지는 않습니다. 이것은 사양을 벗어납니다.)

hjust수평 자리 맞추기를 vjust제어하고 수직 자리 맞추기를 제어합니다.

예를 들어 이것을 분명히해야합니다.

td <- expand.grid(
    hjust=c(0, 0.5, 1),
    vjust=c(0, 0.5, 1),
    angle=c(0, 45, 90),
    text="text"
)

ggplot(td, aes(x=hjust, y=vjust)) + 
    geom_point() +
    geom_text(aes(label=text, angle=angle, hjust=hjust, vjust=vjust)) + 
    facet_grid(~angle) +
    scale_x_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2)) +
    scale_y_continuous(breaks=c(0, 0.5, 1), expand=c(0, 0.2))

여기에 이미지 설명을 입력하십시오


hjust축 텍스트 를 변경할 때 발생하는 상황을 이해하려면 축 텍스트의 가로 정렬이 x 축이 아니라 전체 플롯 (여기에는 y 축 텍스트 포함)과 관련하여 정의된다는 것을 이해해야합니다. (제 생각에 이것은 불행한 일입니다. 축을 기준으로 정렬하는 것이 훨씬 더 유용합니다.)

DF <- data.frame(x=LETTERS[1:3],y=1:3)
p <- ggplot(DF, aes(x,y)) + geom_point() + 
    ylab("Very long label for y") +
    theme(axis.title.y=element_text(angle=0))


p1 <- p + theme(axis.title.x=element_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + theme(axis.title.x=element_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + theme(axis.title.x=element_text(hjust=1)) + xlab("X-axis at hjust=1")

library(ggExtra)
align.plots(p1, p2, p3)

여기에 이미지 설명을 입력하십시오


vjust축 레이블 연결로 발생하는 상황을 탐색하려면 다음을 수행하십시오.

DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p1 <- p + theme(axis.text.x=element_text(vjust=0, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0")
p2 <- p + theme(axis.text.x=element_text(vjust=0.5, colour="red")) + 
        xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + theme(axis.text.x=element_text(vjust=1, colour="red")) + 
        xlab("X-axis labels aligned with vjust=1")


library(ggExtra)
align.plots(p1, p2, p3)

여기에 이미지 설명을 입력하십시오


1
그래서 angle = 45의 경우, 길이가 다른 축 레이블을 가질 때 25에서 5 문자로 말하면 단어 경계의 오른쪽 또는 왼쪽에 정렬되지 않습니다. 여기서 축을 살펴보십시오 angle = 45를 사용 하려면 축을 오른쪽으로 정렬하고 플러시하는 방법은 무엇입니까?
William Gunn

나는 그것을 시도, 나는 수 Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)에 대한 vjust = .72높은.
William Gunn

1
@WilliamGunn 코드로 새로운 질문을 게시하는 것이 좋습니다.
Andrie

1
opt는 더 이상 사용되지 않으므로 축 제목의 위치를 ​​어떻게 조정합니까?
Cyrus Mohammadian

1
@ CyrusMohammadian, 나는 현재 답변을 편집하여 현재 ggplot2 구문으로 작업했습니다.
Droplet

16

아마도 가장 결정적인 부분은 ggplot2 서적의 그림 B.1 (d) 이며, 부록은 http://ggplot2.org/book/appendices.pdf 에서 볼 수 있습니다 .

여기에 이미지 설명을 입력하십시오

그러나 그렇게 간단하지는 않습니다. hjustvjust같은 그것이 어떻게 작동하는지가 설명 geom_text하고 theme_text(때로는). 그것을 생각하는 한 가지 방법은 텍스트 주위의 상자와 상자의 크기에 상대적인 단위로 상자와 관련된 기준점이있는 위치를 생각하는 것입니다 (따라서 크기가 다른 텍스트의 경우). hjust0.5 및 vjust0.5 중심 기준점의 상자. 줄이면 hjust상자 너비 시간만큼 상자가 오른쪽으로 이동합니다 0.5-hjust. 따라서이면 hjust=0상자의 왼쪽 모서리가 기준점에 있습니다. 증가 hjust하면 상자 너비의 양만큼 상자가 왼쪽으로 이동하고 상자hjust-0.5 . 언제hjust=1상자가 가운데에서 왼쪽으로 상자 너비의 절반으로 이동하여 참조 점에 오른쪽 가장자리가 표시됩니다. 인 경우 hjust=2상자의 오른쪽 모서리는 기준점의 왼쪽 상자 너비입니다 (중앙은 기준점의 2-0.5=1.5왼쪽 상자 너비입니다. 세로의 경우 위가 적고 많을수록 아래로). )는 말하지만 [0,1]을 넘어서 외삽합니다.

그러나 때로는 이것이 작동하지 않습니다. 예를 들어

DF <- data.frame(x=c("a","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()

p + opts(axis.text.x=theme_text(vjust=0))
p + opts(axis.text.x=theme_text(vjust=1))
p + opts(axis.text.x=theme_text(vjust=2))

후자의 3 가지 도표는 동일합니다. 왜 그런지 모르겠습니다. 또한 텍스트가 회전되면 더 복잡합니다. 치다

p + opts(axis.text.x=theme_text(hjust=0, angle=90))
p + opts(axis.text.x=theme_text(hjust=0.5 angle=90))
p + opts(axis.text.x=theme_text(hjust=1, angle=90))
p + opts(axis.text.x=theme_text(hjust=2, angle=90))

첫 번째 레이블은 왼쪽에 정렬 된 레이블이 있고 두 번째 레이블은 일부 상자의 가운데에 정렬되어 가운데가 정렬되고 세 번째 레이블이 오른쪽에 정렬됩니다 (오른쪽이 축 옆에 정렬 됨). 마지막으로, 일관된 방법으로 설명 할 수 없습니다. 텍스트의 크기, 가장 넓은 텍스트의 크기와 관련이 있으며 다른 것이 무엇인지 잘 모르겠습니다.


이 점에 대해 감사드립니다. 각도 = 90 인 경우에 도움이되지만 내가 얻지 못하는 것은 각도 = 90 대신 레이블의 오른쪽 정렬이 더 이상 작동하지 않는 이유입니다. 각도 = 45를 사용합니다. angle = 45, hjust = 0의 동작을 이해하지만 angle = 45, hjust = -1은 기괴합니다.
William Gunn

첫 번째 예는 실제로 작동합니다. 작동하지 않는다고 생각하는 이유는 모든 레이블의 높이가 동일하기 때문입니다. 제목 중 하나에 줄 바꿈을 DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)사용하여 다시 시도하십시오 \n.
Andrie

@William, @Andrie가 옳다고 생각합니다. hjustvjust단지 0과 1 사이에 형성된다; 해당 범위 밖의 행동은 의미가 없습니다.
Brian Diggs

@ 앤드리, 당신 말이 맞아요. 그러나 나는 여전히 축 제목 / 텍스트 사례에서 일관된 정신 모델을 만드는 데 어려움을 겪고 있습니다. 축 텍스트의 hjust=0경우 왼쪽 가장자리를 틱에 맞 춥니 다. hjust=0.5틱의 중심; hjust=1오른쪽 가장자리를 틱에 맞 춥니 다 (기준점을 기준으로 움직이는 상자). 그러나 상자 안에 가장 큰 레이블 크기로 vjust정렬 합니다.
Brian Diggs

@BrianDiggs vjust축 레이블의 경우 모든 레이블이 동시에 서로 정렬됩니다. 따라서 모든 상단 가장자리는 언제 정렬 될 때 vjust=1와 마찬가지로 모든 하단 가장자리가 정렬 됩니다 vjust=0. 이것은 나에게 완벽한 의미가 있습니다.
Andrie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.