Co robią hjust i vjust podczas tworzenia fabuły za pomocą ggplot?

Za każdym razem, gdy robię Wykres używając ggplot, spędzam trochę czasu próbując różnych wartości dla hjust i vjust w linii takiej jak

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

Aby etykiety osi ustawiły się w linii, w której etykiety osi prawie dotykają osi i są wyrównane do niej (że tak powiem justowane do osi). Jednak nie bardzo rozumiem, o co chodzi. Często hjust = 0.5 daje tak dramatycznie różne wyniki od hjust = 0.6, na przykład, że nie byłem w stanie tego rozgryźć tylko bawiąc się z różne wartości.

Czy ktoś może wskazać mi wyczerpujące wyjaśnienie, jak działają opcje hjust i vjust?

 116
Author: Gavin Simpson, 2011-09-01

2 answers

Wartości hjust i vjust są zdefiniowane tylko pomiędzy 0 a 1:

  • 0 oznacza lewo-uzasadnione
  • 1 oznacza prawo-uzasadnione

źródło: ggplot2, Hadley Wickham, strona 196

(tak, Wiem, że w większości przypadków można go używać poza tym zakresem, ale nie oczekuj, że zachowa się w jakiś szczególny sposób. To jest poza specyfikacją.)

hjust kontroluje poziome justowanie i vjust kontroluje pionowe justowanie.

Przykład powinien wyjaśnij to:

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

Tutaj wpisz opis obrazka


Aby zrozumieć, co się dzieje po zmianie hjust w tekście osi, musisz zrozumieć, że wyrównanie poziome dla tekstu osi jest zdefiniowane Nie w odniesieniu do osi x, ale do całego wykresu (gdzie obejmuje to tekst osi y). (Jest to, moim zdaniem, niefortunne. O wiele bardziej przydatne byłoby wyrównanie względem osi.)

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


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

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

Tutaj wpisz opis obrazka


Aby zbadać, co się dzieje z vjust oznaczenie osi:

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

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


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

Tutaj wpisz opis obrazka

 202
Author: Andrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 16:11:40

Prawdopodobnie najbardziej ostateczny jest rysunek B. 1(d) z książki ggplot2, której załączniki są dostępne na http://ggplot2.org/book/appendices.pdf .

Tutaj wpisz opis obrazka

Nie jest to jednak takie proste. hjust i vjust zgodnie z opisem, jak to działa w geom_text i theme_text (czasami). Jednym ze sposobów myślenia o tym jest myślenie o polu wokół tekstu i gdzie punkt odniesienia jest w stosunku do tego pola, w jednostkach w stosunku do rozmiaru z pudełka (a więc różne dla tekstów o różnej wielkości). hjust o wartości 0,5 i vjust o wartości 0,5 wyśrodkowują pole na punkcie odniesienia. Redukcja hjust przesuwa pole w prawo o ilość razy szerokości pola 0.5-hjust. Tak więc, gdy hjust=0, lewa krawędź pola znajduje się w punkcie odniesienia. Zwiększenie hjust przesuwa pole w lewo o ilość razy szerokości pola hjust-0.5. Gdy hjust=1, pole jest przesunięte o połowę szerokości pola w lewo od środka, co umieszcza prawą krawędź na punkcie odniesienia. If hjust=2, prawa krawędź pudełka to szerokość Pudełka na lewo od punktu odniesienia (środek to 2-0.5=1.5 szerokość Pudełka na lewo od punktu odniesienia. W pionie mniej jest w górę, a Więcej w dół. To jest faktycznie to, co mówi rysunek B. 1(d), ale ekstrapoluje poza [0,1]. Ale czasami to nie działa. Na przykład
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))

Trzy ostatnie działki są identyczne. Nie wiem dlaczego. Ponadto, jeśli tekst jest obrócony, jest to bardziej skomplikowane. Rozważmy

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

Pierwszy ma etykiety w lewo justowane (na dole), drugi ma je wyśrodkowane w jakimś polu, więc ich środki wyrównują się, a trzeci ma je w prawo justowane(więc ich prawe boki ustawiają się obok osi). Ostatniego, cóż, nie potrafię wyjaśnić w spójny sposób. Ma to coś wspólnego z wielkością tekstu, wielkością najszerszego tekstu i nie jestem pewien, co jeszcze.

 12
Author: Brian Diggs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 19:59:57