5
votes

ggplot scale_color_manual avec des pauses ne correspond pas à l'ordre attendu

Je fais un nuage de points et j'aimerais spécifier l'ordre du texte dans la légende, ainsi que les couleurs. En utilisant ggplot, l'ordre des couleurs ne correspond pas à l'ordre du texte tel qu'il est écrit.

Mon code:

  gs.pal <- colorRampPalette(c("red","blue"),bias=.1,space="rgb")
+scale_color_manual(breaks = c("Dark","DarkLight","Medium","LightDark","Light"),
                       values=gs.pal(5))

Je ne veux pas l'ordre par défaut du texte dans la légende , donc je voudrais changer l'ordre pour être:

"Dark", "DarkLight", "Medium", "LightDark", "Light"

Je veux aussi couleurs pour être dans le dégradé:

"rouge", "orange", "jaune", "cadetblue2", "dodgerblue"

Alors que Dark = Red, DarkLight = orange, Moyen = jaune, LightDark = cadetblue2, Light = bleu.

C'est ce que je suppose qu'il se passerait avec le code ci-dessus. Mais comme tracé, le texte ne correspond pas à la couleur et j'ai:

Dark = Red, DarkLight = orange, Medium = Blue, LightDark = cadetblue2, Light = jaune.

Remarque - J'ai le même problème lors de l'utilisation d'une palette de couleurs:

MyX<-c(1,2,3,4,5)
MyY<-c(3,4,5,2,7)
MyCat<-c("Dark","Medium","DarkLight","LightDark","Light")
MyDF<-data.frame(MyX,MyY,MyCat)


ggplot(MyDF, aes(x=MyX, y=MyY, color=MyCat)) +
  geom_point()+
  xlab("Time") + 
  ylab("Num") +
  scale_color_manual(breaks =     c("Dark","DarkLight","Medium","LightDark","Light"),
                     values=c("red", "orange","yellow","cadetblue2","dodgerblue"))


0 commentaires

3 Réponses :


5
votes

ggplot organise la variable MyCat dans l'ordre alphabétique afin d'éviter cela, il faut définir cette variable comme un facteur dans l'ordre souhaité:

library(ggplot2)

MyDF<-data.frame(MyX,MyY,MyCat)

#define as factor in the desired order
MyDF$MyCat<-factor(MyDF$MyCat, levels=c("Dark","DarkLight","Medium","LightDark","Light"))

ggplot(MyDF, aes(x=MyX, y=MyY, color=MyCat)) +
  geom_point()+
  xlab("Time") + 
  ylab("Num") +
  scale_color_manual(breaks = c("Dark","DarkLight","Medium","LightDark","Light"),
                     values=c("red", "orange","yellow","cadetblue2","dodgerblue"))

Cela devrait fournir l'ordre souhaité entrez la description de l'image ici


1 commentaires

Merci beaucoup! Une idée pourquoi est-ce si aléatoire? et pas du tout intuitif. On s'attendrait à ce que les pauses et les valeurs correspondent à One for One!



2
votes

Dave2e a publié une solution élégante; J'ai eu un problème similaire en comparant deux ensembles de données, où sa solution (je pense) était moins pratique. Une autre approche pourrait être d'utiliser l'option étiquettes, tout en vous assurant que vos catégories sont alphabétiques:

ggplot(MyDF, aes(x=MyX, y=MyY, color="a")) +
  geom_point()+
  geom_point(data=data.frame(time=c(1,2,3),num=c(4,5,6)),aes(x=time,y=num,color="c"))+
  geom_hline(aes(yintercept=3.5, color="b"))+
  xlab("Time") + 
  ylab("Num") +
  scale_color_manual(breaks = c("a","b","c"),
                     values= c("black", "red","blue"),
                    labels= c("c_black_line","b_red_line","a_blue_line"))

Ce qui fonctionne aussi assez simplement, vous avez différents ensembles de données:

MyX<-c(1,2,3,4,5)
MyY<-c(3,4,5,2,7)
MyCat<-c("a","b","c","d","e")
MyDF<-data.frame(MyX,MyY,MyCat)

ggplot(MyDF, aes(x=MyX, y=MyY, color=MyCat)) +
  geom_point()+
  xlab("Time") + 
  ylab("Num") +
  scale_color_manual(breaks = c("a","b","c","d","e"),
                     values= c("red", "orange","yellow","cadetblue2","dodgerblue"),
                    labels= c("Dark","Medium","DarkLight","LightDark","Light"))


0 commentaires

5
votes

Ceci définit les noms, les couleurs et l'ordre des légendes en même temps.

p <- ggplot(dd) + 
      geom_line(aes(x=num_round, y = goods, color = "Good"), size=1) +
      geom_line(aes(x=num_round, y = mediums, color = "Medium"), size=1) + 
      geom_line(aes(x=num_round, y = bads, color = "Bad"), size=1) + 
      scale_color_manual("State", breaks=c("Good", "Medium", "Bad"),
                         values=c("Good"="green","Medium"="orange","Bad"="red")) 
print(p)

entrez la description de l'image ici


0 commentaires