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

enter image description here

Foi útil?

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:

alt text

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

enter image description here


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:

Example

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top