geom_text - ¿Qué debe hacer hjust y vjust cuando hace una trama usando ggplot?
ggplot title center (2)
El valor de hjust
y vjust
solo se define entre 0 y 1:
- 0 significa justificado a la izquierda
- 1 significa justificado a la derecha
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 y vjust
controla la justificación vertical.
Un ejemplo debería aclarar esto:
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))
Para entender lo que sucede cuando se cambia el hjust
en el texto del eje, se debe entender que la alineación horizontal para el texto del eje se define en relación no al eje x, sino a toda la gráfica (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).
DF <- data.frame(x=LETTERS[1:3],y=1:3)
p <- ggplot(DF, aes(x,y)) + geom_point() +
ylab("Very long label for y") +
opts(axis.title.y=theme_text(angle=0))
p1 <- p + opts(axis.title.x=theme_text(hjust=0)) + xlab("X-axis at hjust=0")
p2 <- p + opts(axis.title.x=theme_text(hjust=0.5)) + xlab("X-axis at hjust=0.5")
p3 <- p + opts(axis.title.x=theme_text(hjust=1)) + xlab("X-axis at hjust=1")
library(ggExtra)
align.plots(p1, p2, p3)
Para explorar lo que sucede con la alineación de eje de etiquetas de eje:
DF <- data.frame(x=c("a/na","b","cdefghijk","l"),y=1:4)
p <- ggplot(DF, aes(x,y)) + geom_point()
p1 <- p + opts(axis.text.x=theme_text(vjust=0, colour="red")) +
xlab("X-axis labels aligned with vjust=0")
p2 <- p + opts(axis.text.x=theme_text(vjust=0.5, colour="red")) +
xlab("X-axis labels aligned with vjust=0.5")
p3 <- p + opts(axis.text.x=theme_text(vjust=1, colour="red")) +
xlab("X-axis labels aligned with vjust=1")
library(ggExtra)
align.plots(p1, p2, p3)
Cada vez que hago una trama usando ggplot, me paso un poco 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 de los ejes se alineen donde las etiquetas de los ejes casi tocan el eje, y están alineadas contra el mismo (justificadas al eje, por así decirlo). Sin embargo, realmente no entiendo lo que está pasando. A menudo, hjust = 0.5
da resultados tan radicalmente diferentes de hjust = 0.6
, por ejemplo, que no he podido averiguarlo simplemente jugando con diferentes valores.
¿Alguien puede indicarme una explicación exhaustiva de cómo funcionan las opciones hjust y vjust?
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 así de simple. hjust
y vjust
como se describe allí son cómo funciona en geom_text
y theme_text
(a veces). Una forma de pensarlo es pensar en un recuadro alrededor del texto, y donde el punto de referencia está en relación con ese recuadro, en unidades relativas al tamaño del recuadro (y, por lo tanto, diferente para los textos de diferente tamaño). Un hjust
de 0.5 y un vjust
de 0.5 centrar la caja en el punto de referencia. La reducción de hjust
mueve la caja justo por una cantidad del ancho de la caja multiplicado por 0.5-hjust
. Por lo tanto, cuando hjust=0
, el borde izquierdo de la caja está en el punto de referencia. Al aumentar hjust
mueve el cuadro dejado por una cantidad de ancho de cuadro multiplicado por hjust-0.5
. Cuando hjust=1
, la caja se mueve medio ancho de cuadro desde el centro, lo que coloca el borde derecho en el punto de referencia. Si hjust=2
, el borde derecho de la caja es un ancho de caja a la izquierda del punto de referencia (el centro es 2-0.5=1.5
anchos de caja a la izquierda del punto de referencia. Para vertical, menos arriba y más abajo. Esto es efectivamente lo que dice la figura B.1 (d), pero extrapola más allá de [0,1].
Pero, a veces esto no funciona. Por ejemplo
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))
Las tres últimas parcelas son idénticas. No sé por qué es eso. Además, si se rota el texto, entonces es más complicado. Considerar
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))
El primero tiene las etiquetas justificadas a la izquierda (contra el fondo), el segundo las tiene centradas en un recuadro para que sus centros se alineen, y el tercero las tiene justificadas a la derecha (para que sus lados derechos se alineen al lado del eje). El último, bueno, no puedo explicarlo de una 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.