179 votes

Que font hjust et vjust lors de la création d'un graphique à l'aide de ggplot?

Chaque fois que je fais un graphique 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 aligner les étiquettes d'axe là où les étiquettes d'axe touchent presque l'axe, et sont alignées contre lui (justifié 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 tellement différents de hjust = 0.6, par exemple, que je n'ai pas pu le comprendre juste en jouant avec différentes valeurs.

Est-ce que quelqu'un peut me diriger vers une explication complète de comment fonctionnent les options hjust et vjust?

1 votes

J'ai donné un exemple spécifique, dans les commentaires de la première réponse. Apparemment, l'utilisation de nombres en dehors de 0-1 est indéfinie, ce qui, sans expliquer pourquoi hjust=-1 a un comportement bizarre, explique au moins que le bizarre est à prévoir.

320voto

Andrie Points 66979

La valeur de hjust et de vjust est uniquement définie entre 0 et 1 :

  • 0 signifie justifié à gauche
  • 1 signifie justifié à droite

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. Cela est en dehors des spécifications.)

hjust contrôle l'alignement horizontal et vjust contrôle l'alignement vertical.

Un exemple devrait clarifier cela :

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

description de l'image


Pour comprendre ce qui se passe lorsque vous changez le hjust dans le texte de l'axe, vous devez comprendre que l'alignement horizontal du texte de l'axe est défini non pas par rapport à l'axe des x, mais à l'ensemble du graphique (où cela inclut le texte de l'axe des y). (C'est, à mon avis, malheureux. Il serait beaucoup plus utile d'avoir l'alignement relatif à l'axe.)

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

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

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

description de l'image


Pour explorer ce qui se passe avec l'alignement vjust des étiquettes d'axe :

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("Étiquettes de l'axe X alignées avec vjust=0")
p2 <- p + theme(axis.text.x=element_text(vjust=0.5, colour="red")) + 
        xlab("Étiquettes de l'axe X alignées avec vjust=0.5")
p3 <- p + theme(axis.text.x=element_text(vjust=1, colour="red")) + 
        xlab("Étiquettes de l'axe X alignées avec vjust=1")

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

description de l'image

1 votes

Donc, dans le cas de angle=45, lorsque j'ai des étiquettes d'axe de longueurs variables, disons de 25 à 5 caractères, elles ne sont ni alignées justifiées à droite ni à gauche des frontières des mots. Jetez un œil aux axes ici. Si je devais utiliser angle=45, comment les alignerais-je justifiés à droite et collés contre l'axe?

0 votes

J'ai essayé cela, et j'obtiens Erreur dans grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Bord du polygone non trouvé (largeur ou hauteur nulle ?) pour vjust = .72 et plus.

1 votes

@WilliamGunn Je vous suggère de poster une nouvelle question avec votre code.

19voto

Brian Diggs Points 22433

Sans doute le plus définitif est Figure B.1(d) de la première édition du livre ggplot2.

Capture d'écran de la Figure B.1 de la page 197 de la première édition de

Note : la troisième édition du livre disponible sur https://ggplot2-book.org/ ne semble pas inclure ces annexes ni cette figure.

Cependant, ce n'est pas aussi simple. hjust et vjust décrits là-bas sont la façon dont cela fonctionne dans geom_text et theme_text (parfois). Une manière de le comprendre est d'envisager une boîte autour du texte, et où le point de référence se situe par rapport à cette boîte, en unités relatives à la taille de la boîte (et donc différent pour les textes de différentes tailles). Un hjust de 0.5 et un vjust de 0.5 centrent la boîte sur le point de référence. En réduisant hjust, la boîte se déplace vers la droite d'une quantité égale à la largeur de la boîte fois 0.5-hjust. Ainsi, lorsque hjust=0, le bord gauche de la boîte se trouve au point de référence. Augmenter hjust déplace la boîte vers la gauche d'une quantité égale à la largeur de la boîte fois hjust-0.5. Lorsque hjust=1, la boîte est déplacée d'une demi-largeur de boîte vers la gauche à partir du centre, plaçant le bord droit sur le point de référence. Si hjust=2, le bord droit de la boîte est une largeur de boîte à gauche du point de référence (le centre est à 2-0.5=1.5 largeurs de boîte à gauche du point de référence. Pour la verticale, moins de valeur correspond à vers le haut et plus de valeur à vers le bas. C'est effectivement ce que dit cette Figure B.1(d), mais cela va au-delà de [0,1].

Mais, parfois ça ne fonctionne pas. Par exemple

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

Les trois derniers graphiques sont identiques. Je ne sais pas pourquoi. De plus, si le texte est rotatif, alors c'est plus compliqué. Considérez

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

Le premier a les étiquettes justifiées à gauche (contre le bas), le deuxième les centre dans une boîte de sorte que leurs centres s'alignent, et le troisième les justifie à droite (de sorte que leurs côtés droits s'alignent à côté de l'axe). Pour 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 suis pas sûr de quoi d'autre.

0 votes

Merci beaucoup pour cela, cela aide pour le cas où l'angle = 90, mais ce que je ne comprends pas, c'est pourquoi la justification à droite des étiquettes ne fonctionne plus lorsque au lieu de angle=90, j'utilise angle=45. Je comprends le comportement de angle=45, hjust=0, mais angle=45, hjust=-1 est tout simplement bizarre.

0 votes

Votre premier exemple fonctionne en réalité. La raison pour laquelle vous pensez que cela ne fonctionne pas est que toutes vos étiquettes ont la même hauteur. Essayez à nouveau avec DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4) - c'est-à-dire avec un saut de ligne \n dans l'un des titres.

0 votes

@William, je pense que @Andrie a raison; hjust et vjust ne sont définis que entre 0 et 1; un comportement en dehors de cette plage n'a pas besoin d'avoir de sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X