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
Les valeurs de hjust
et vjust
ne sont définies 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 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))
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)
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)
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 .
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.