Chaque fois que je fais un tracé en utilisant ggplot, je passe un peu de temps à essayer différentes valeurs pour hjust et vjust dans une ligne comme
+ opts(axis.text.x = theme_text(hjust = 0.5))
pour que les étiquettes des axes s'alignent là où les étiquettes des axes touchent presque l'axe et sont alignées contre lui (justifiées par rapport à l'axe, pour ainsi dire). Cependant, je ne comprends pas vraiment ce qui se passe. Souvent, hjust = 0.5
donne des résultats si radicalement différents hjust = 0.6
, par exemple, que je n'ai pas été en mesure de le comprendre simplement en jouant avec des valeurs différentes.
Quelqu'un peut-il m'indiquer une explication complète du fonctionnement des options hjust et vjust?
Réponses:
La valeur de
hjust
etvjust
n'est définie qu'entre 0 et 1:Source: ggplot2, Hadley Wickham, page 196
(Oui, je sais que dans la plupart des cas, vous pouvez l'utiliser au-delà de cette plage, mais ne vous attendez pas à ce qu'il se comporte d'une manière spécifique. Ceci est en dehors des spécifications.)
hjust
contrôle la justification horizontale etvjust
contrôle la justification verticale.Un exemple devrait clarifier cela:
Pour comprendre ce qui se passe lorsque vous modifiez le
hjust
texte de l'axe, vous devez comprendre que l'alignement horizontal du texte de l'axe n'est pas défini par rapport à l'axe des x, mais à l'ensemble du tracé (où cela inclut le texte de l'axe des y). (C'est, à mon avis, regrettable. Il serait beaucoup plus utile d'avoir l'alignement par rapport à l'axe.)Pour explorer ce qui se passe avec l'
vjust
alignement des étiquettes d'axe:la source
Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)
pourvjust = .72
et plus.La plus définitive est probablement la Figure B.1 (d) du livre ggplot2, dont les annexes sont disponibles sur http://ggplot2.org/book/appendices.pdf .
Cependant, ce n’est pas aussi simple.
hjust
etvjust
comme décrit, il y a comment cela fonctionne dansgeom_text
ettheme_text
(parfois). Une façon d'y penser est de penser à une boîte autour du texte, et où se trouve le point de référence par rapport à cette boîte, en unités par rapport à la taille de la boîte (et donc différentes pour les textes de taille différente). Unhjust
de 0,5 et unvjust
de 0,5 centrent la boîte sur le point de référence. La réductionhjust
déplace la boîte vers la droite d'une quantité de fois la largeur de la boîte0.5-hjust
. Ainsi quandhjust=0
, le bord gauche de la boîte est au point de référence. L'augmentationhjust
déplace la boîte vers la gauche d'une quantité de fois la largeur de la boîtehjust-0.5
. Quandhjust=1
, la boîte est déplacée d'une demi-largeur à gauche du centre, ce qui place le bord droit sur le point de référence. Sihjust=2
, le bord droit de la boîte est une largeur de boîte à gauche du point de référence (le centre est la2-0.5=1.5
largeur de la boîte à gauche du point de référence. Pour la verticale, moins est en haut et plus est en bas. C'est effectivement ce que la Figure B.1 (d ) dit, mais il extrapole au-delà de [0,1].Mais parfois cela ne fonctionne pas. Par exemple
Les trois derniers graphiques sont identiques. Je ne sais pas pourquoi. De plus, si le texte est pivoté, c'est plus compliqué. Considérer
Le premier a les étiquettes justifiées à gauche (contre le bas), le second les a centrées dans une boîte afin que leurs centres s'alignent, et le troisième les a justifiés à droite (de sorte que leurs côtés droits s'alignent à côté de l'axe). Le dernier, eh bien, je ne peux pas l'expliquer de manière cohérente. Cela a quelque chose à voir avec la taille du texte, la taille du texte le plus large, et je ne sais pas quoi d'autre.
la source
DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
- c'est-à-dire avec un\n
saut de ligne dans l'un des titres.hjust
etvjust
ne sont définis qu'entre 0 et 1; un comportement en dehors de cette fourchette n’a pas de sens.hjust=0
aligne le bord gauche avec le tic;hjust=0.5
se concentre sur le tic;hjust=1
aligne le bord droit avec le tic (boîte mobile par rapport au point de référence). Maisvjust
s'aligne dans une boîte de la taille de l'étiquette la plus haute.vjust
étiquettes d'axe, toutes les étiquettes sont simultanément alignées les unes avec les autres. Ainsi, tous les bords supérieurs s'alignent quandvjust=1
et de même tous les bords inférieurs quandvjust=0
. Cela me semble parfaitement logique.