2012-10-08 29 views
52

estoy tratando de hacer una heatmap usando ggplot2 usando la función geom_tiles aquí está mi código de abajo:¿Cómo ordena específicamente ggplot2 eje x en lugar de orden alfabético?

p<-ggplot(data,aes(Treatment,organisms))+geom_tile(aes(fill=S))+ 
    scale_fill_gradient(low = "black",high = "red") + 
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0)) + 
    theme(legend.position = "right", 
    axis.ticks = element_blank(), 
    axis.text.x = element_text(size = base_size, angle = 90, hjust = 0, colour = "black"), 
    axis.text.y = element_text(size = base_size, hjust = 1, colour = "black")). 

de datos es mi archivo data.csv
mi eje X es tipos de tratamiento
Mi Y eje es tipos de organismos

No estoy muy familiarizado con los comandos y la programación y soy relativamente nuevo en esto. Solo quiero poder especificar el orden de las etiquetas en el eje x. En este caso, estoy tratando de especificar el orden de "Tratamiento". Por defecto, ordena alfabéticamente. ¿Cómo anulo esto/guardo los datos en el mismo orden que en mi archivo csv original?

He intentado este comando

scale_x_discrete(limits=c("Y","X","Z")) 

donde x, y y z son mi pedido condición de tratamiento. Sin embargo, no funciona muy bien y me da cajas de calor faltantes.

Respuesta

85

Es un poco difícil responder a su pregunta específica sin un ejemplo completo y reproducible. Sin embargo algo como esto debería funcionar:

#Turn your 'treatment' column into a character vector 
data$Treatment <- as.character(data$Treatment) 
#Then turn it back into an ordered factor 
data$Treatment <- factor(data$Treatment, levels=unique(data$Treatment)) 

En este ejemplo, el orden del factor será el mismo que en el archivo data.csv.

Si prefiere un orden diferente, se pueden hacer pedidos a mano:

data$Treatment <- factor(data$Treatment, levels=c("Y", "X", "Z")) 

Sin embargo, esto es peligroso si usted tiene una gran cantidad de niveles: si tiene alguno de ellos mal, que causará problemas.

+0

OMG! ¡Entiendo! Muchas gracias, esto era exactamente lo que necesitaba! :) Usted acaba de hacer mi día. –

+10

Tengo que preguntarme por qué esto es necesario. ¿Por qué los ejes se reordenan por ggplot en primer lugar? Parece peligroso si alguien no sabe que esto va a suceder. –

+0

Acabo de toparme con este problema haciendo un [heatmap con qplot] (http://martinsbioblogg.wordpress.com/2013/03/21/using-r-correlation-heatmap-with-ggplot2/) y se aplicaron nombres de variables automáticamente . ¿Debería ser reportado? –

0

Tropezamos con esta respuesta debido a una pregunta duplicada actual. La única respuesta actual ofrece una solución que requiere cambiar el marco de datos subyacente. Pero eso no es necesario. También se puede simplemente definir un vector para la disposición y usarlo en la llamada estética directamente. La siguiente solución obviamente no es muy diferente a la respuesta anterior, con la importante diferencia de que el marco de datos original no se cambia.

level_order <- c('virginica', 'versicolor', 'setosa') 

ggplot(iris, aes(x = factor(Species, level = level_order), y = Petal.Width)) + geom_col() 

o

level_order <- factor(iris$Species, level = c('virginica', 'versicolor', 'setosa')) 

ggplot(iris, aes(x = level_order, y = Petal.Width)) + geom_col() 

that's for the first version

Cuestiones relacionadas