Etiquetas de eje giratorio y espaciado en ggplot2


Tengo una gráfica 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 descubierto esta parte con el código de abajo, pero como puedes ver, las etiquetas no son totalmente visibles.

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

introduzca la descripción de la imagen aquí

Author: amonk, 2009-08-26

4 answers

Cambie la última línea a

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

De forma predeterminada, los ejes están alineados en el centro del texto, incluso cuando se rotan. Cuando rotas + / - 90 grados, normalmente quieres que esté alineado en el borde:

texto alt

La imagen de arriba es de esta entrada de blog.

 806
Author: Jonathan Chang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 14:14:45

Para que el texto de las etiquetas de marca sea completamente visible y se lea en la misma dirección que la etiqueta del eje y, cambie la última línea a

q + theme(axis.text.x=element_text(angle=90, hjust=1))
 67
Author: e3bo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-24 05:03:25

Utilizar + coord_flip().

En "R for Data Science", 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 desea gráficos de caja horizontales. También es útil para etiquetas largas:es difícil conseguir que encajen sin superponerse en el eje X.

Aplicando esto a su parcela, solo agregamos + 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()

introduzca la descripción de la imagen aquí

Y ahora los títulos super largos se extienden horizontalmente y son muy fáciles de leer!

 45
Author: Rich Pauloo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-06 06:10:14

Me gustaría proporcionar una solución alternativa, una solución robusta similar a lo que estoy a punto de proponer se requería en la última versión de ggtern, desde la introducción de la función de rotación de canvas.

Básicamente, es necesario determinar las posiciones relativas utilizando trigonometría, mediante la construcción de una función que devuelve un objeto element_text, dado ángulo (es decir,grados) y posicionamiento (es decir,uno de x, y, superior 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 un 'auto' opción debe estar disponible en ggplot2 para los argumentos hjust y vjust, al especificar el ángulo, de todos modos, vamos a demostrar cómo funciona lo anterior.

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

Ejemplo

 20
Author: Nicholas Hamilton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 12:39:36