Rotazione e spaziatura delle etichette degli assi in ggplot2


Answers

Per rendere il testo sulle etichette di spunta completamente visibili e leggere nella stessa direzione dell'etichetta dell'asse y, modificare l'ultima riga su

q + theme(axis.text.x=element_text(angle=90, hjust=1))
Question

Ho un grafico in cui l'asse x è un fattore le cui etichette sono lunghe. Anche se probabilmente non è una visualizzazione ideale, per ora mi piacerebbe semplicemente ruotare queste etichette per essere verticali. Ho capito questa parte con il codice qui sotto, ma come puoi vedere, le etichette non sono completamente visibili.

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




Mi piacerebbe fornire una soluzione alternativa, poiché è stata richiesta una soluzione robusta simile a quella che sto per proporre nell'ultima versione di ggtern , poiché ho introdotto la funzione di rotazione della tela.

Fondamentalmente, è necessario determinare le posizioni relative utilizzando la trigonometria, costruendo una funzione che restituisce un oggetto element_text , una data angolazione (cioè gradi) e una posizione (cioè una delle informazioni x, y, superiore o destra).

#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, a mio parere, penso che un'opzione 'auto' dovrebbe essere resa disponibile in ggplot2 per gli argomenti hjust e vjust , quando specificando l'angolo, comunque, dimostriamo come funziona quanto sopra.

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

Che produce quanto segue: