Domanda

Ho una trama in cui l'asse X è un fattore le cui etichette sono lunghe. Sebbene probabilmente non sia una visualizzazione ideale, per ora vorrei semplicemente ruotare queste etichette per essere verticali. Ho capito questa parte con il codice qui sotto, ma come puoi vedere, le etichette non sono totalmente 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))

enter image description here

È stato utile?

Soluzione

Cambia l'ultima riga in

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

Per impostazione predefinita, gli assi sono allineati al centro del testo, anche quando ruotati. Quando ruoti +/- 90 gradi, di solito vuoi che sia allineato al bordo:

alt text

L'immagine sopra è da Questo post sul blog.

Altri suggerimenti

Per rendere il testo sulle etichette del tick completamente visibile e letta nella stessa direzione dell'etichetta dell'asse Y, cambia l'ultima riga in

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

Uso 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


In ch 3.9 di R per la scienza dei dati, Wickham e Grolemund parlano a questa esatta domanda:

coord_flip() commuta gli assi X e Y. Questo è utile (ad esempio), se si desidera grafici a scatole orizzontali. È anche utile per le etichette lunghe: è difficile farli adattarsi senza sovrapposizioni sull'asse X.

Vorrei fornire una soluzione alternativa, una soluzione robusta simile a quella che sto per proporre era richiesta nell'ultima versione di ggtern, dall'introduzione della funzione di rotazione della tela.

Fondamentalmente, è necessario determinare le posizioni relative usando la trigonometria, costruendo una funzione che restituisce un element_text oggetto, dato angolo (cioè gradi) e posizionamento (cioè una delle informazioni x, y, in alto 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, secondo me, penso che un'opzione "auto" dovrebbe essere resa disponibile in ggplot2 per il hjust e vjust Gli argomenti, quando si specificano 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:

Example

Il ggpubr Il pacchetto offre un collegamento che fa la cosa giusta per impostazione predefinita (Testo di allineatura a destra, casella di testo allineamento a medio da spuntare):

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

Creato il 2018-11-06 dal Pacchetto Reprex (V0.2.1)

Trovato con una ricerca GitHub per i nomi degli argomenti pertinenti: https://github.com/search?l=r&q=element_text+ngle+90+vjust+org%3Acran&type=Code

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top