Hjust và ojust làm gì khi thực hiện một cốt truyện bằng ggplot?


159

Mỗi lần tôi thực hiện một cốt truyện bằng ggplot, tôi dành một chút thời gian để thử các giá trị khác nhau cho sự công bằng và bất công trong một dòng như

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

để có được các nhãn trục thẳng hàng trong đó các nhãn trục gần như chạm vào trục và được đặt thẳng vào nó (có thể nói là chính xác với trục). Tuy nhiên, tôi không thực sự hiểu chuyện gì đang xảy ra. Thông thường, hjust = 0.5ví dụ , cho các kết quả khác nhau đáng kể như vậy hjust = 0.6, ví dụ, tôi không thể tìm ra nó chỉ bằng cách chơi xung quanh với các giá trị khác nhau.

Bất cứ ai có thể chỉ cho tôi một lời giải thích toàn diện về cách các lựa chọn công bằng và bất công?


1
Tôi đã đưa ra một ví dụ cụ thể, trong các ý kiến ​​cho câu trả lời đầu tiên. Rõ ràng việc sử dụng các số bên ngoài 0-1 là không xác định, điều này, nếu không giải thích được tại sao hjust = -1 có hành vi kỳ quái, ít nhất là giải thích rằng kỳ lạ sẽ xảy ra.
William Gunn

Câu trả lời:


277

Giá trị của hjustvjustchỉ được xác định trong khoảng từ 0 đến 1:

  • 0 có nghĩa là trái
  • 1 có nghĩa là đúng

Nguồn: ggplot2, Hadley Wickham, trang 196

(Vâng, tôi biết rằng trong hầu hết các trường hợp, bạn có thể sử dụng nó vượt quá phạm vi này, nhưng đừng mong đợi nó hoạt động theo bất kỳ cách cụ thể nào. Đây là thông số bên ngoài.)

hjustkiểm soát biện minh ngang và vjustkiểm soát biện minh dọc.

Một ví dụ cần làm rõ điều này:

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))

nhập mô tả hình ảnh ở đây


Để hiểu điều gì xảy ra khi bạn thay đổi hjustvăn bản trục, bạn cần hiểu rằng căn chỉnh ngang cho văn bản trục được xác định không liên quan đến trục x, mà là toàn bộ cốt truyện (trong đó bao gồm văn bản trục y). (Điều này, theo quan điểm của tôi, thật không may. Sẽ hữu ích hơn nhiều nếu có sự liên kết so với trục.)

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)

nhập mô tả hình ảnh ở đây


Để khám phá những gì xảy ra với vjustviệc dán nhãn trục:

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)

nhập mô tả hình ảnh ở đây


1
Vì vậy, đối với trường hợp angle = 45, khi tôi có nhãn trục có độ dài khác nhau, giả sử từ 25 đến 5 ký tự, chúng không được căn chỉnh hợp lý ở bên phải hoặc bên trái của ranh giới từ. Hãy nhìn vào các trục ở đây Nếu tôi sử dụng angle = 45, làm thế nào để tôi làm cho chúng hợp lý và dội vào trục?
William Gunn

Tôi đã cố gắng đó, và tôi nhận được Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)cho vjust = .72và cao hơn.
William Gunn

1
@WilliamGunn Tôi đề nghị bạn gửi một câu hỏi mới với mã của bạn.
Andrie

1
Vì opt không được dùng nữa, làm thế nào để chúng ta điều chỉnh vị trí của tiêu đề trục?
Cyrus Mohammadian

1
@CyrusMohammadian, tôi đã chỉnh sửa câu trả lời này để làm việc với cú pháp ggplot2 hiện tại.
Giọt

16

Có lẽ chắc chắn nhất là Hình B.1 (d) của cuốn sách ggplot2, các phụ lục có sẵn tại http://ggplot2.org/book/appendices.pdf .

nhập mô tả hình ảnh ở đây

Tuy nhiên, nó không hoàn toàn đơn giản. hjustvjustnhư được mô tả có cách nó hoạt động trong geom_texttheme_text(đôi khi). Một cách để nghĩ về nó là nghĩ về một hộp xung quanh văn bản và điểm tham chiếu liên quan đến hộp đó, tính theo đơn vị so với kích thước của hộp (và do đó khác nhau đối với các văn bản có kích thước khác nhau). Một hjust0,5 và một vjust0,5 trung tâm hộp trên điểm tham chiếu. Giảm hjustdi chuyển hộp phải bằng một số lần chiều rộng của hộp 0.5-hjust. Do đó hjust=0, khi cạnh trái của hộp nằm ở điểm tham chiếu. Tăng hjustdi chuyển hộp còn lại bằng một số lần chiều rộng của hộp hjust-0.5. Khi nàohjust=1, hộp được di chuyển một nửa chiều rộng hộp bên trái từ giữa, đặt cạnh phải vào điểm tham chiếu. Nếu hjust=2, cạnh phải của hộp là chiều rộng hộp bên trái của điểm tham chiếu (chính giữa là 2-0.5=1.5chiều rộng hộp bên trái của điểm tham chiếu. Đối với phương thẳng đứng, ít hơn và nhiều hơn là xuống. Đây thực sự là hình B.1 (d ) nói, nhưng nó ngoại suy ngoài [0,1].

Nhưng, đôi khi điều này không hoạt động. Ví dụ

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))

Ba lô sau giống hệt nhau. Tôi không biết tại sao lại như vậy. Ngoài ra, nếu văn bản được xoay, thì nó phức tạp hơn. Xem xét

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))

Cái đầu tiên có các nhãn bên trái (so với đáy), cái thứ hai đặt chúng ở giữa trong một số hộp để các trung tâm của chúng thẳng hàng và thứ ba có chúng bên phải (vì vậy các cạnh bên phải của chúng nằm cạnh trục). Điều cuối cùng, tốt, tôi không thể giải thích một cách mạch lạc. Nó có liên quan đến kích thước của văn bản, kích thước của văn bản rộng nhất và tôi không chắc chắn điều gì khác.


Cảm ơn rất nhiều vì điều này, điều này giúp ích cho trường hợp angle = 90, nhưng điều tôi không nhận được là tại sao việc chứng minh đúng nhãn không hoạt động nữa khi thay vì angle = 90, tôi sử dụng angle = 45. Tôi hiểu hành vi của angle = 45, hjust = 0, nhưng angle = 45, hjust = -1 chỉ là kỳ quái.
William Gunn

Trong ví dụ đầu tiên của bạn, trên thực tế, làm việc. Lý do bạn nghĩ rằng nó không hoạt động là vì tất cả các nhãn của bạn có cùng chiều cao. Hãy thử lại với DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)- tức là với một \ndòng trong một trong những tiêu đề.
Andrie

@William, tôi nghĩ @Andrie có quyền; hjustvjustchỉ được xác định trong khoảng từ 0 đến 1; hành vi bên ngoài phạm vi đó không cần phải có ý nghĩa.
Brian Diggs

@Andrie, Bạn nói đúng. Nhưng tôi vẫn có một thời gian khó khăn để tạo ra một mô hình tinh thần mạch lạc trong trường hợp tiêu đề / văn bản trục. Đối với văn bản trục, hjust=0căn chỉnh cạnh trái với tic; hjust=0.5trung tâm trên tic; hjust=1căn chỉnh cạnh phải với tic (hộp di chuyển so với điểm tham chiếu). Nhưng vjustcăn chỉnh trong một hộp kích thước của nhãn cao nhất.
Brian Diggs

@BrianDiggs Trong trường hợp vjustnhãn trục, tất cả các nhãn được liên kết đồng thời với nhau. Vì vậy, tất cả các cạnh trên cùng căn chỉnh khi vjust=1và tương tự như vậy tất cả các cạnh dưới khi vjust=0. Nó có ý nghĩa tuyệt vời với tôi.
Andrie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.