2009-08-25 123 views
420

Tengo un diagrama donde el eje x es un factor cuyas etiquetas son largas. Aunque probablemente no sea una visualización ideal, por ahora me gustaría simplemente rotar estas etiquetas para que sean verticales. He descifrado esta parte con el siguiente código, pero como puede ver, las etiquetas no son totalmente visibles.Rotar y espaciar las etiquetas de los ejes en ggplot2

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

Respuesta

678

Cambie la última línea para

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

Por defecto, los ejes están alineados en el centro del texto, incluso cuando se hace girar. Al girar +/- 90 grados, por lo general, quiere que sea alineado en el borde en su lugar:

alt text

La imagen de arriba es de this blog post.

+80

En la versión más reciente de ggplot2 el comando sería: 'q + tema (axis.text.x = element_text (ángulo = -90, hjust = 0)) existe' ' – rnorberg

+0

ya no element_text', a menos que sea no en el paquete ggplot2 ... – naught101

+38

Para aquellos para quienes hjust no se comporta como se describe aquí, intente 'theme (axis.text.x = element_text (angle = 90, vjust = 0.5))'. A partir de ggplot2 0.9.3.1, esta parece ser la solución. – lilster

57

Para que el texto en las etiquetas de garrapatas completamente visibles y leer en la misma dirección que la etiqueta del eje Y, cambiar la última línea para

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

Ahora debería ser: '' opts'' ---> '' theme'' y '' theme_text'' ---> 'element_text'' – PatrickT

15

me gustaría proporcionar una solución alternativa, una Se requirió una solución robusta similar a lo que voy a proponer en la última versión de ggtern, desde que introdujimos la función de rotación de lienzo.

Básicamente, necesita determinar las posiciones relativas mediante trigonometría, construyendo una función que devuelve un objeto element_text, un ángulo determinado (es decir, grados) y la posición (es decir, uno de x, y, arriba o derecha) información.

#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, en mi opinión, creo que una opción 'auto' debe estar disponible en ggplot2 para los hjustvjust y argumentos, al especificar el ángulo, de todos modos, vamos a demostrar cómo las obras anteriores.

#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 produce lo siguiente:

Example

+1

No obtengo el mismo resultados, para mí el texto del eje nunca está bien ajustado usando su método automático. Sin embargo, el uso de 'rads = (-angle - positions [[position]]) * pi/180' produjo mejores ubicaciones. Tenga en cuenta el signo menos adicional antes del ángulo. Gracias por el código de todos modos :) –

16

Uso + coord_flip().

En "R para Ciencia de datos", Wickham y Grolemund hablan de este problema exacto. En el capítulo 3.8, Ajustes de posición , escriben:

coord_flip() cambia los ejes x e y. Esto es útil (por ejemplo), si quieres diagramas de caja horizontales. También es útil para etiquetas largas: es difícil ajustarlas sin superposición en el eje x.

Aplicando esto a su trama, simplemente añadimos + coord_flip() a la 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

Y ahora los títulos súper largos es horizontalmente hacia fuera y muy fácil de leer!

Cuestiones relacionadas