Toda vez que faço um gráfico usando ggplot, passo um pouco tentando valores diferentes para hjust e vjust em uma linha como
+ opts(axis.text.x = theme_text(hjust = 0.5))
para alinhar os rótulos dos eixos onde os rótulos dos eixos quase tocam o eixo e ficam nivelados contra ele (justificados pelo eixo, por assim dizer). No entanto, eu realmente não entendo o que está acontecendo. Freqüentemente, hjust = 0.5
dá resultados tão dramaticamente diferentes de hjust = 0.6
, por exemplo, que eu não consegui descobrir isso apenas brincando com valores diferentes.
Alguém pode me indicar uma explicação abrangente de como as opções hjust e vjust funcionam?
Respostas:
O valor de
hjust
evjust
é definido apenas entre 0 e 1:Fonte: ggplot2, Hadley Wickham, página 196
(Sim, eu sei que na maioria dos casos, você pode usá-lo além desse intervalo, mas não espere que ele se comporte de maneira específica. Isso está fora das especificações.)
hjust
controla a justificação horizontal evjust
controla a justificação vertical.Um exemplo deve deixar isso claro:
Para entender o que acontece quando você altera o
hjust
texto do eixo in, é necessário entender que o alinhamento horizontal do texto do eixo é definido em relação não ao eixo x, mas a todo o gráfico (onde isso inclui o texto do eixo y). (Isso é, na minha opinião, infeliz. Seria muito mais útil ter o alinhamento em relação ao eixo.)Para explorar o que acontece com o
vjust
alinhamento dos rótulos dos eixos:fonte
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
e superior.Provavelmente a mais definitiva é a Figura B.1 (d) do livro ggplot2, cujos apêndices estão disponíveis em http://ggplot2.org/book/appendices.pdf .
No entanto, não é tão simples assim.
hjust
e,vjust
como descrito, há como funcionageom_text
etheme_text
(às vezes). Uma maneira de pensar nisso é pensar em uma caixa ao redor do texto, e onde o ponto de referência está em relação a essa caixa, em unidades relativas ao tamanho da caixa (e, portanto, diferente para textos de tamanho diferente). Anhjust
de 0,5 e avjust
de 0,5 centralizam a caixa no ponto de referência. Reduzirhjust
move a caixa para a direita uma quantidade de vezes a largura da caixa0.5-hjust
. Assimhjust=0
, quando a borda esquerda da caixa está no ponto de referência. Aumentarhjust
move a caixa deixada em uma quantidade de vezes a largura da caixahjust-0.5
. Quandohjust=1
, a caixa é movida para a metade da largura da esquerda, centralizada, o que coloca a borda direita no ponto de referência. Sehjust=2
a borda direita da caixa for a largura da caixa à esquerda do ponto de referência (o centro é a2-0.5=1.5
largura da caixa à esquerda do ponto de referência. Na vertical, menos é para cima e mais é para baixo. Isso é efetivamente o que a Figura B.1 (d ) diz, mas extrapola além de [0,1].Mas, às vezes isso não funciona. Por exemplo
Os três últimos gráficos são idênticos. Não sei por que é isso. Além disso, se o texto for girado, será mais complicado. Considerar
O primeiro tem os rótulos justificados à esquerda (na parte inferior), o segundo os centraliza em alguma caixa para que seus centros se alinhem e o terceiro os justifica à direita (para que seus lados direito se alinhem ao lado do eixo). O último, bem, não sei explicar de maneira coerente. Tem algo a ver com o tamanho do texto, o tamanho do texto mais amplo, e não tenho certeza do que mais.
fonte
DF <- data.frame(x=c("a\na","b","cdefghijk","l"),y=1:4)
- ou seja, com uma\n
quebra de linha em um dos títulos.hjust
evjust
são definidos apenas entre 0 e 1; comportamento fora desse intervalo não precisa fazer sentido.hjust=0
alinha a borda esquerda com o tique;hjust=0.5
Centros no tique;hjust=1
alinha a borda direita com o tique (caixa móvel em relação ao ponto de referência). Masvjust
alinha dentro de uma caixa o tamanho da etiqueta mais alta.vjust
rótulos dos eixos, todos os rótulos são alinhados simultaneamente. Portanto, todas as arestas superiores se alinham quandovjust=1
e da mesma forma todas as arestas inferiores quandovjust=0
. Isso faz muito sentido pra mim.