Za każdym razem, gdy tworzę wykres za pomocą ggplot, spędzam trochę czasu próbując różnych wartości hjust i vjust w linii takiej jak
+ opts(axis.text.x = theme_text(hjust = 0.5))
aby etykiety osi były wyrównane w miejscu, w którym etykiety osi prawie dotykają osi i są zrównane z nią (wyrównane do osi, że tak powiem). Jednak tak naprawdę nie rozumiem, co się dzieje. Często hjust = 0.5
daje tak radykalnie odmienne wyniki od hjust = 0.6
, na przykład, że nie byłem w stanie tego rozgryźć, po prostu bawiąc się różnymi wartościami.
Czy ktoś może wskazać mi obszerne wyjaśnienie, jak działają opcje hjust i vjust?
Odpowiedzi:
Wartości
hjust
ivjust
są zdefiniowane tylko między 0 a 1:Ź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 będzie się zachowywał w jakikolwiek określony sposób. To jest poza specyfikacją).
hjust
steruje wyrównaniem poziomym ivjust
wyrównaniem pionowym.Przykład powinien to wyjaśnić:
Aby zrozumieć, co się dzieje, gdy zmieniasz
hjust
tekst na osi, musisz zrozumieć, że wyrównanie poziome tekstu osi jest definiowane nie w odniesieniu do osi x, ale do całego wykresu (gdzie obejmuje to tekst na osi y). (Moim zdaniem jest to niefortunne. O wiele bardziej przydatne byłoby ustawienie wyrównania względem osi).Aby zbadać, co dzieje się z
vjust
wyrównaniem etykiet osi:źródło
Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)
dovjust = .72
wyżej.Prawdopodobnie najbardziej ostateczny jest rysunek B.1 (d) książki ggplot2, której załączniki są dostępne pod adresem http://ggplot2.org/book/appendices.pdf .
Jednak nie jest to takie proste.
hjust
ivjust
zgodnie z opisem, jak to działa wgeom_text
itheme_text
(czasami). Jednym ze sposobów myślenia o tym jest myślenie o ramce wokół tekstu i miejscu, w którym punkt odniesienia znajduje się w stosunku do tego pola, w jednostkach zależnych od rozmiaru ramki (a zatem różne dla tekstów o różnych rozmiarach). Wartościhjust
0,5 ivjust
0,5 wyśrodkowują prostokąt w punkcie odniesienia. Zmniejszeniehjust
przesuwa pudełko w prawo o wielkość razy szerokość pudełka0.5-hjust
. Zatem kiedyhjust=0
lewa krawędź pudełka znajduje się w punkcie odniesienia. Zwiększeniehjust
przesuwa ramkę w lewo o określoną wartość razy szerokość pudełkahjust-0.5
. Kiedyhjust=1
, pudełko zostanie przesunięte o pół szerokości pola w lewo od środka, co spowoduje umieszczenie prawej krawędzi w punkcie odniesienia. Jeślihjust=2
prawa krawędź prostokąta jest szerokością prostokąta na lewo od punktu odniesienia (środek to2-0.5=1.5
szerokość prostokąta na lewo od punktu odniesienia. W przypadku pionu mniej jest w górę, a więcej w dół. ) mówi, ale ekstrapoluje poza [0,1].Ale czasami to nie działa. Na przykład
Trzy ostatnie wątki są identyczne. Nie wiem, dlaczego tak jest. Ponadto, jeśli tekst jest obracany, jest to bardziej skomplikowane. Rozważać
Pierwsza ma etykiety wyrównane do lewej (do dołu), druga ma je wyśrodkowane w jakimś polu, tak aby ich środki były wyrównane, a trzecia ma je wyrównane do prawej (tak, aby ich prawe boki były wyrównane do osi). Ostatniego, cóż, nie potrafię w spójny sposób wyjaśnić. Ma to coś wspólnego z rozmiarem tekstu, rozmiarem najszerszego tekstu i nie jestem pewien, co jeszcze.
źródło
DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
- np. Z\n
przełamaniem wiersza w jednym z tytułów.hjust
ivjust
są zdefiniowane tylko między 0 a 1; zachowanie poza tym zakresem nie musi mieć sensu.hjust=0
wyrównuje lewą krawędź z kreską;hjust=0.5
koncentruje się na tiku;hjust=1
wyrównuje prawą krawędź z tikiem (przesuwanie prostokąta względem punktu odniesienia). Alevjust
wyrównuje się w polu wielkości najwyższej etykiety.vjust
etykiet osi wszystkie etykiety są jednocześnie wyrównane względem siebie. Zatem wszystkie górne krawędzie są wyrównane, kiedyvjust=1
i wszystkie dolne krawędzie, kiedyvjust=0
. To ma dla mnie sens.