2012-01-03 25 views
20

Cuando uso geom_tile() con ggplot2 y discretos escalas las etiquetas están en orden ascendente en el eje x y en orden descendente en el eje y:ggplot2: orden de cambio de visualización de una variable de factor en un eje

#some sample data 
a <- runif(400) 
a <- matrix(a, ncol=20) 
colnames(a) <- letters[seq(from = 1, to = 20)] 
rownames(a) <- letters[seq(from = 1, to = 20)] 
a <- melt(a) 

Cuando trazar la trama de datos a esto sale:

ggplot(a, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient(low = "white", high = "black", breaks=seq(from=0, to=1, by=.1), name="value") + 
opts(axis.text.x=theme_text(angle=-90, hjust=0)) + 
scale_x_discrete(name="") + scale_y_discrete(name="") 

y las coordenadas están etiquetados de forma diferente para x e y:

enter image description here

Me gustaría tener las etiquetas clasificadas de a-z de arriba a abajo y de izquierda a derecha. ¿hay una manera rápida de hacer esto?

+2

Es posible que también desee agregar un 'limits = c (0, 1)' a su comando 'scale_colour_gradient' actual - actualmente 1 está fuera de los límites de la escala y no está coloreado correctamente en la leyenda. – hadley

+0

@hadley: ¡muchas gracias! que probablemente habría sido mi segunda pregunta;) – Seb

+0

¿Cómo no ordenar las etiquetas y en absoluto? Si tengo meses, por ejemplo, J, F, M, A, M. Se ordena de forma automática. ¿Es posible anular este comportamiento predeterminado? Gracias – rmf

Respuesta

30

El punto importante aquí es el orden de los niveles de factor. El orden en los niveles también es el orden en la trama. Puede utilizar rev para invertir el orden de los niveles de este tipo (tenga en cuenta que acabo de reordenar una columna en un hoja.de.datos):

df$X1 = with(df, factor(X1, levels = rev(levels(X1)))) 

Utilice esta sintaxis para cambiar el orden de los factores, según sea necesario.

+0

gracias por su ayuda rápida! Pero eso no cambia los ejes x * y * y y. El eje x debe permanecer como está. ¿O me salió algo mal? – Seb

+0

Puede cambiar el orden de los niveles para cada variable en el data.frame por separado. Simplemente invierta los que necesita. –

+0

Edité mi respuesta para aclarar este problema. –

4

Para los casos en los que prefiere no modificar el orden de los factores en los datos subyacentes, se puede obtener el mismo resultado utilizando el limits argumento para scale_y_discrete:

ggplot(a, aes(X1, X2, fill = value)) + 
    geom_tile() + 
    scale_y_discrete(name="", limits = rev(levels(a$X2))) 

Dando esta salida:

enter image description here

Cuestiones relacionadas