Etiquetas dos eixos de rotação e espaçamento em ggplot2
Tenho uma trama onde o eixo dos x é um factor cujos rótulos são longos. Embora provavelmente não seja uma visualização ideal, por agora eu gostaria de simplesmente rodar essas etiquetas para ser vertical. Descobri esta parte com o código abaixo, mas como podem ver, as etiquetas 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))
4 answers
Muda a última linha para
q + theme(axis.text.x = element_text(angle = 90, hjust = 1))
Por omissão, os eixos estão alinhados no centro do texto, mesmo quando rodados. Quando você roda + / - 90 graus, você normalmente quer que ele esteja alinhado na borda em vez disso:
A imagem acima é de Este post .
Para tornar o texto nas etiquetas de marcação totalmente visível e lido na mesma direcção que o rótulo do eixo y, mude a última linha para
q + theme(axis.text.x=element_text(angle=90, hjust=1))
Utilizar + coord_flip()
.
Em " R " para a Ciência dos dados, Wickham e Grolemund falam exactamente deste problema. No capítulo 3.8, ajustamentos de posição , eles escrevem:
Aplicando isto ao seu enredo, apenas adicionamos
coord_flip()
muda os eixos x e Y. Isto é útil (por exemplo), se você quiser boxplots horizontais. Também é útil para etiquetas longas: é difícil fazê-las encaixar sem sobrepor-se no eixo x.
+ coord_flip()
ao ggplot:
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
qplot(cut,carat,data = diamonds, geom = "boxplot") +
coord_flip()
E agora os títulos super longos estão horizontalmente espalhados e muito fáceis de ler!
Eu gostaria de fornecer uma solução alternativa, uma solução robusta semelhante ao que eu estou prestes a propor foi necessária na última versão de ggtern , uma vez que a introdução do recurso de rotação de tela.
Basicamente, você precisa determinar as posições relativas usando trigonometria, construindo uma função que retorna um objeto element_text
, dado â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 um a opção' auto ' deve ser disponibilizada em ggplot2
para os argumentos hjust
e vjust
, ao especificar o ângulo, de qualquer forma, vamos demonstrar como funciona o acima.
#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 os seguintes produtos: