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.5
ofrece 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
hjust
yvjust
solo 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).
hjust
controla la justificación horizontal yvjust
controla la justificación vertical.Un ejemplo debería aclarar esto:
Para comprender lo que sucede cuando cambia el
hjust
texto 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
vjust
alineació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 = .72
y 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.
hjust
yvjust
como se describe hay cómo funcionageom_text
ytheme_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). Unhjust
0.5 y unvjust
0.5 centran el recuadro en el punto de referencia. La reducciónhjust
mueve 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, sehjust
mueve 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.5
ancho 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\n
salto de línea en uno de los títulos.hjust
yvjust
solo se definen entre 0 y 1; El comportamiento fuera de ese rango no tiene por qué tener sentido.hjust=0
alinea el borde izquierdo con el tic;hjust=0.5
se centra en el tic;hjust=1
alinea el borde derecho con el tic (cuadro en movimiento relativo al punto de referencia). Pero sevjust
alinea dentro de un cuadro del tamaño de la etiqueta más alta.vjust
etiquetas de eje, todas las etiquetas se alinean simultáneamente entre sí. Por lo tanto, todos los bordes superiores se alinean cuandovjust=1
y del mismo modo todos los bordes inferiores cuandovjust=0
. Esto tiene sentido para mi.