122 votes

Comment ordonner 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 correspond aux types de traitement
mon axe Y est les types d'organismes

Je ne suis pas très familier avec les commandes et la programmation et je suis relativement nouveau dans ce domaine. Je veux simplement pouvoir spécifier l'ordre des étiquettes sur l'axe des x. Dans ce cas, j'essaie de spécifier l'ordre des "Trea" et des "Trea". Dans ce cas, j'essaie de spécifier l'ordre de "Traitement". Par défaut, l'ordre est alphabétique. Comment puis-je passer outre à cet ordre et 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 l'ordre de mes conditions de traitement. Cependant, cela ne fonctionne pas très bien, et me donne des boîtes de chaleur manquantes.

162voto

Drew Steen Points 3742

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 l'option data.csv fichier.

Si vous préférez un ordre différent, 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 sur l'un d'entre eux, cela posera des problèmes.

94voto

Tjebo Points 2775

La réponse acceptée propose une solution qui nécessite de modifier le cadre de données sous-jacent. Cela n'est pas nécessaire. On peut aussi simplement factoriser dans le cadre aes() directement ou créez un vecteur pour cela à la place.

Ce n'est certainement pas très différent de Réponse de l'utilisateur Drew Steen mais avec la différence importante de ne pas modifier le cadre de données 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()

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 le 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X