Etiquetas de eixos rotativos e de espaçamento em GGPlot2
Pergunta
Eu tenho um enredo onde o eixo x é um fator cujos rótulos são longos. Embora provavelmente não seja uma visualização ideal, por enquanto eu gostaria de simplesmente girar esses rótulos para ser vertical. Eu descobri essa parte com o código abaixo, mas, como você pode ver, os rótulos não são totalmente visíveis.
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + opts(axis.text.x=theme_text(angle=-90))
Solução
Mudar a última linha para
q + theme(axis.text.x = element_text(angle = 90, hjust = 1))
Por padrão, os eixos estão alinhados no centro do texto, mesmo quando girados. Quando você gira +/- 90 graus, geralmente deseja que fique alinhado na borda:
A imagem acima é de esta postagem do blog.
Outras dicas
Para tornar o texto nos rótulos de tickt totalmente visível e ler na mesma direção que o rótulo do eixo y, mude a última linha para
q + theme(axis.text.x=element_text(angle=90, hjust=1))
Usar coord_flip()
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
qplot(cut,carat,data = diamonds, geom = "boxplot") +
coord_flip()
No CH 3.9 de R para ciência de dados, Wickham e Grolemund falam com essa pergunta exata:
coord_flip()
Muda os eixos X e Y. Isso é útil (por exemplo), se você deseja gráficos de caixa horizontais. Também é útil para rótulos longos: é difícil fazê-los se encaixar sem se sobrepor no eixo x.
Eu gostaria de fornecer uma solução alternativa, uma solução robusta semelhante ao que estou prestes a propor foi necessário na versão mais recente de ggtern, desde a introdução do recurso de rotação da tela.
Basicamente, você precisa determinar as posições relativas usando trigonometria, construindo uma função que retorna um element_text
objeto, dado o ângulo (ou seja, graus) e posicionamento (ou seja, uma das informações x, y, superior ou direita).
#Load Required Libraries
library(ggplot2)
library(gridExtra)
#Build Function to Return Element Text Object
rotatedAxisElementText = function(angle,position='x'){
angle = angle[1];
position = position[1]
positions = list(x=0,y=90,top=180,right=270)
if(!position %in% names(positions))
stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE)
if(!is.numeric(angle))
stop("'angle' must be numeric",call.=FALSE)
rads = (angle - positions[[ position ]])*pi/180
hjust = 0.5*(1 - sin(rads))
vjust = 0.5*(1 + cos(rads))
element_text(angle=angle,vjust=vjust,hjust=hjust)
}
Francamente, na minha opinião, acho que uma opção 'Auto' deve ser disponibilizada em ggplot2
para o hjust
e vjust
De qualquer forma, argumentos, ao especificar o ângulo, vamos demonstrar como o acima funciona.
#Demonstrate Usage for a Variety of Rotations
df = data.frame(x=0.5,y=0.5)
plots = lapply(seq(0,90,length.out=4),function(a){
ggplot(df,aes(x,y)) +
geom_point() +
theme(axis.text.x = rotatedAxisElementText(a,'x'),
axis.text.y = rotatedAxisElementText(a,'y')) +
labs(title = sprintf("Rotated %s",a))
})
grid.arrange(grobs=plots)
Que produz o seguinte:
o ggpubr O pacote oferece um atalho que faz a coisa certa por padrão (texto alinhado correto, caixa de texto alinhada do meio para marcar):
library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()
Criado em 2018-11-06 pelo Pacote Reprex (v0.2.1)
Encontrado com uma busca no Github pelos nomes de argumentos relevantes: https://github.com/search?l=r&q=element_text+angle+90+vjust+org%3acran&type=code