web-dev-qa-db-fra.com

Que font les justes et les justes lors de la création d’un complot avec ggplot?

Chaque fois que je crée un complot avec 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))

aligner les étiquettes d’axe là où les étiquettes d’axe touchent presque l’axe et s’affleurent contre celui-ci (pour ainsi dire, dans l’axe). Cependant, je ne comprends pas vraiment ce qui se passe. Souvent, hjust = 0.5 donne des résultats si différents de hjust = 0.6, par exemple, je n'ai pas été capable de le comprendre en jouant avec des valeurs différentes.

Quelqu'un peut-il m'indiquer une explication détaillée de la manière dont les options just et vjust fonctionnent

140
William Gunn

Les valeurs de hjust et vjust ne sont définies qu'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 de manière spécifique. Ceci est en dehors des spécifications.)

hjust contrôle la justification horizontale et vjust contrôle la justification verticale.

Un exemple devrait préciser ceci:

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

enter image description here


Pour comprendre ce qui se passe lorsque vous modifiez le texte de l’axe hjust, vous devez comprendre que l’alignement horizontal du texte de l’axe est défini par rapport non pas à l’axe des x, mais à l’ensemble du tracé (où cela inclut la texte en ordonnée). (Ceci est, à mon avis, malheureux. Il serait beaucoup plus utile d'avoir l'alignement par rapport à l'axe.)

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)

enter image description here


Pour explorer ce qui se passe avec vjust l'alignement 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("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)

enter image description here

233
Andrie

Le plus définitif est probablement la figure B.1 (d) du livre ggplot2, dont les annexes sont disponibles à http: // ggplot2.org/book/appendices.pdf .

enter image description here

Cependant, ce n'est pas si simple. hjust et vjust tels qu'ils sont décrits, voici comment cela fonctionne dans geom_text et theme_text (quelquefois). Une façon d'y penser est de penser à une boîte autour du texte, et où le point de référence est par rapport à cette boîte, en unités par rapport à la taille de la boîte (et donc différente pour les textes de taille différente). Un hjust de 0,5 et un vjust de 0,5 centrent la boîte sur le point de référence. Réduire hjust déplace la boîte vers la droite d’un montant égal à la largeur de la boîte fois 0.5-hjust. Ainsi quand hjust=0, le bord gauche de la boîte est au point de référence. L'augmentation de hjust déplace la boîte vers la gauche d'une quantité de la largeur de la boîte multipliée par hjust-0.5. Quand hjust=1, la case est déplacée d'une demi-largeur à gauche du centre, ce qui place 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 largeur de la boîte à gauche du point de référence. Pour vertical, moins c'est haut et plus c'est bas. C’est bien ce que dit la figure B.1 (d), mais elle extrapole au-delà de [0,1].

Mais parfois cela 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 dernières parcelles sont identiques. Je ne sais pas pourquoi. En outre, si le texte est pivoté, il est plus compliqué. Considérer

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 laissées justifiées (contre le bas), le second les a centrées dans une case afin que leurs centres s'alignent, et le troisième les a justifiées à droite (donc leurs côtés droits s'alignent à côté de l'axe). Le dernier, eh bien, je ne peux pas 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.

13
Brian Diggs