Cada vez que hago un diagrama usando ggplot, paso un poco de tiempo probando diferentes valores para hjust y vjust en una línea como
+ opts(axis.text.x = theme_text(hjust = 0.5))
para que las etiquetas del eje se alineen donde las etiquetas del eje casi tocan el eje y están alineadas contra él (justificadas por el eje, por así decirlo). Sin embargo, realmente no entiendo lo que está pasando. A menudo, hjust = 0.5ofrece resultados tan drásticamente diferentes de hjust = 0.6, por ejemplo, que no he podido resolverlo solo jugando con diferentes valores.
¿Alguien puede señalarme una explicación completa de cómo funcionan las opciones hjust y vjust?

Respuestas:
El valor de
hjustyvjustsolo se define entre 0 y 1:Fuente: ggplot2, Hadley Wickham, página 196
(Sí, sé que en la mayoría de los casos puede usarlo más allá de este rango, pero no espere que se comporte de una manera específica. Esto está fuera de las especificaciones).
hjustcontrola la justificación horizontal yvjustcontrola la justificación vertical.Un ejemplo debería aclarar esto:
Para comprender lo que sucede cuando cambia el
hjusttexto en el eje, debe comprender que la alineación horizontal para el texto del eje se define no en relación con el eje x, sino con todo el diagrama (donde esto incluye el texto del eje y). (Esto es, en mi opinión, desafortunado. Sería mucho más útil tener la alineación relativa al eje).Para explorar lo que sucede con la
vjustalineación de las etiquetas de los ejes:fuente
Error in grid.Call("L_textBounds", as.graphicsAnnot(x$label), x$x, x$y, : Polygon edge not found (zero-width or zero-height?)porvjust = .72y superior.Probablemente la más definitiva sea la Figura B.1 (d) del libro ggplot2, cuyos apéndices están disponibles en http://ggplot2.org/book/appendices.pdf .
Sin embargo, no es tan simple.
hjustyvjustcomo se describe hay cómo funcionageom_textytheme_text(a veces). Una forma de pensarlo es pensar en un cuadro alrededor del texto, y donde el punto de referencia está en relación con ese cuadro, en unidades relativas al tamaño del cuadro (y, por lo tanto, diferente para textos de diferente tamaño). Unhjust0.5 y unvjust0.5 centran el recuadro en el punto de referencia. La reducciónhjustmueve la caja a la derecha en una cantidad de veces el ancho de la caja0.5-hjust. Asíhjust=0, cuando , el borde izquierdo de la caja está en el punto de referencia. Al aumentar, sehjustmueve la caja hacia la izquierda una cantidad de veces el ancho de la cajahjust-0.5. Cuandohjust=1, el cuadro se mueve la mitad del ancho del cuadro hacia la izquierda desde el centro, lo que coloca el borde derecho en el punto de referencia. Sihjust=2, el borde derecho de la caja es un ancho de caja a la izquierda del punto de referencia (el centro es el2-0.5=1.5ancho de la caja a la izquierda del punto de referencia. Para vertical, menos está arriba y más está abajo. Esto es efectivamente lo que esa figura B.1 (d ) dice, pero extrapola más allá de [0,1].Pero, a veces esto no funciona. Por ejemplo
Las tres últimas tramas son idénticas. No sé por qué es eso. Además, si el texto se gira, entonces es más complicado. Considerar
El primero tiene las etiquetas a la izquierda justificadas (en la parte inferior), el segundo las tiene centradas en algún recuadro para que sus centros se alineen, y el tercero las justifica a la derecha (para que sus lados derechos se alineen al lado del eje). El último, bueno, no puedo explicarlo de manera coherente. Tiene algo que ver con el tamaño del texto, el tamaño del texto más ancho, y no estoy seguro de qué más.
fuente
DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4), es decir, con un\nsalto de línea en uno de los títulos.hjustyvjustsolo se definen entre 0 y 1; El comportamiento fuera de ese rango no tiene por qué tener sentido.hjust=0alinea el borde izquierdo con el tic;hjust=0.5se centra en el tic;hjust=1alinea el borde derecho con el tic (cuadro en movimiento relativo al punto de referencia). Pero sevjustalinea dentro de un cuadro del tamaño de la etiqueta más alta.vjustetiquetas de eje, todas las etiquetas se alinean simultáneamente entre sí. Por lo tanto, todos los bordes superiores se alinean cuandovjust=1y del mismo modo todos los bordes inferiores cuandovjust=0. Esto tiene sentido para mi.