¿Cómo se ordena específicamente el eje x de ggplot2 en lugar del orden alfabético?

Resuelto Lisa Ta asked hace 54 años • 3 respuestas

Estoy tratando de heatmapusar ggplot2la geom_tilesfunción. 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 son los tipos de tratamiento
mi eje Y son los tipos de organismos

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

He probado este comando

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

donde x, y y z son el orden de mi condición de tratamiento. Sin embargo, no funciona muy bien y me faltan cajas de calor.

Lisa Ta avatar Jan 01 '70 08:01 Lisa Ta
Aceptado

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 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 data.csvarchivo.

Si prefieres un orden diferente, puedes pedirlos en mano:

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

Sin embargo, esto es peligroso si tienes muchos niveles: si te equivocas en alguno de ellos, causarás problemas.

Drew Steen avatar Oct 08 '2012 13:10 Drew Steen

También se puede simplemente factorizar aes()directamente dentro de la llamada. No estoy seguro de por qué establecer los límites no funciona para usted; supongo que obtiene NA porque es posible que tenga errores tipográficos en su vector de nivel.

Ciertamente, lo siguiente no es muy diferente de la respuesta del usuario Drew Steen , pero con la importante diferencia de no cambiar el marco de datos original.

library(ggplot2)
## this vector might be useful for other plots/analyses
level_order <- c('virginica', 'versicolor', 'setosa') 

p <- ggplot(iris)
p + geom_bar(aes(x = factor(Species, level = level_order)))


## or directly in the aes() call without a pre-created vector:
p + geom_bar(aes(x = factor(Species, level = c('virginica', 'versicolor', 'setosa')))) 
## plot identical to the above - not shown

## or use your vector as limits in scale_x_discrete
p + geom_bar(aes(x = Species)) + 
  scale_x_discrete(limits = level_order) 

Creado el 2022-11-20 con reprex v2.0.2

tjebo avatar Feb 26 '2018 22:02 tjebo