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

J’essaie de faire une ggplot2 utilisant ggplot2 utilisant la fonction geom_tiles , 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")). 

les données sont mon fichier data.csv
mon axe X est des types de traitement
mon axe Y est des types d’organismes

Je ne suis pas trop familier avec les commandes et la programmation et je suis relativement nouveau à cela. 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 commande par ordre alphabétique. Comment puis-je remplacer ceci / 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 mes ordres de traitement. Cela ne fonctionne toutefois pas très bien et me manque des boîtes à chaleur.

Il est un peu difficile de répondre à votre question spécifique sans un exemple complet et reproductible. Cependant, quelque chose comme ça 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 fichier data.csv .

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 posera des problèmes.

Trébuché sur cette réponse à cause d’une question en double actuelle. La réponse la plus acceptée offre une solution qui nécessite de modifier le 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 modifier 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() 

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

c'est pour la première version