web-dev-qa-db-fra.com

Comment commandez-vous spécifiquement l'axe des x de ggplot2 au lieu de l'ordre alphabétique?

J'essaie de faire un heatmap en utilisant ggplot2 en utilisant le geom_tiles fonction voici mon code ci-dessous:

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")).

data est mon fichier data.csv
Mon axe X indique les types de traitement.
Mon axe Y correspond aux types d'organismes.

Je ne suis pas trop familier avec les commandes et la programmation et je suis relativement nouveau dans ce domaine. Je veux juste pouvoir spécifier l'ordre des étiquettes sur l'axe des x. Dans ce cas, j'essaie de spécifier l'ordre de "Traitement". Par défaut, il ordonne par ordre alphabétique. Comment puis-je remplacer/conserver les données dans le même ordre que dans mon fichier CSV d'origine?

J'ai essayé cette commande

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

où x, y et z sont mon ordre de condition de traitement. Cependant, cela ne fonctionne pas très bien et me donne des caisses thermiques manquantes.

66
Lisa Ta

Il est un peu difficile de répondre à votre question spécifique sans un exemple complet et reproductible. Cependant, quelque chose comme ceci devrait fonctionner:

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

Dans cet exemple, l'ordre du facteur sera le même que dans le data.csv fichier.

Si vous préférez une commande différente, vous pouvez les commander à la main:

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

Cependant, cela est dangereux si vous avez beaucoup de niveaux: si vous vous trompez, cela causera des problèmes.

100
Drew Steen

La réponse la plus acceptée offre une solution nécessitant un changement du bloc de données sous-jacent. Ce n'est pas nécessaire. On peut aussi simplement factoriser directement dans l'appel aes() ou créer un vecteur pour cela.

Ce n'est certainement pas très différent de la réponse de @Drew Steen, mais avec la différence importante de ne pas changer le bloc de données d'origine.

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

ou

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

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

ou
directement dans l'appel aes() sans vecteur pré-créé:

ggplot(iris, aes(x = factor(Species, level = c('virginica', 'versicolor', 'setosa')), y = Petal.Width)) + geom_col()

that's for the first version

11
Tjebo