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))

enter image description here

Author: amonk, 2009-08-26

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:

alt text

A imagem acima é de Este post .

 806
Author: Jonathan Chang, 2017-02-08 14:14:45

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))
 67
Author: e3bo, 2016-05-24 05:03:25

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:

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.

Aplicando isto ao seu enredo, apenas adicionamos + 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()

enter image description here

E agora os títulos super longos estão horizontalmente espalhados e muito fáceis de ler!
 45
Author: Rich Pauloo, 2017-09-06 06:10:14

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:

Example

 20
Author: Nicholas Hamilton, 2016-05-02 12:39:36