grafico ggplot change bars barras r ggplot2 r-faq

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