change - order bars in ggplot
¿Cómo ordena específicamente ggplot2 eje x en lugar de orden alfabético? (2)
Estoy tratando de hacer un heatmap
usando ggplot2
usando la función geom_tiles
aquí está mi código a continuación:
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")).
los datos son mi archivo data.csv
mi eje X es tipos de tratamiento
mi eje Y 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 orden de condición de tratamiento. Sin embargo, no funciona muy bien y me da cajas de calor faltantes.
Es un poco difícil responder a su pregunta específica sin un ejemplo completo y reproducible. Sin embargo, algo así debería funcionar:
#Turn your ''treatment'' column into a character vector
data$Treatment <- as.character(data$Treatment)
#Then turn it back into a factor with the levels in the correct order
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 pedido diferente, puede solicitarlo a mano:
data$Treatment <- factor(data$Treatment, levels=c("Y", "X", "Z"))
Sin embargo, esto es peligroso si tienes muchos niveles: si obtienes alguno de ellos, eso causará problemas.
Tropecé con esta respuesta debido a una pregunta duplicada actual. La respuesta más aceptada ofrece una solución que requiere cambiar el marco de datos subyacente. Esto no es necesario. También se puede factorizar simplemente dentro de la llamada aes () directamente o crear un vector para eso.
Esto ciertamente no es muy diferente a la respuesta de @Drew Steen, pero con la importante diferencia de no cambiar el marco de datos original.
level_order <- c(''virginica'', ''versicolor'', ''setosa'') #this vector might be useful for other plots/analyses
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()
editar : o directamente en la llamada aes () sin un vector creado previamente:
ggplot(iris, aes(x = factor(Species, level = c(''virginica'', ''versicolor'', ''setosa'')), y = Petal.Width)) + geom_col()