2017-09-24 2 views
1

Je crée une intrigue où je dois mélanger des noms, des couleurs et des formes dans une seule légende. Il semble que la légende ordonne mes données par ordre alphabétique classeName générant une discordance avec mes formes et couleurs de classe ... Je dois avoir une forme unique par superclasses A, B, C donc je pensais avoir A1, A2, A3 comme triangles, et B1, B2 en tant que cercles. Comment puis-je forcer les noms de légende à suivre le même ordre que les couleurs et les formes dans mes données? (Je ne veux pas l'ordre alphabétique dans la légende qui n'a pas de sens pour mon application réelle)Continuez à trier mes données dans la légende ggplot où la couleur et la forme sont combinées

Voici mes données et le code:

library(ggplot2) 
x<-c(1,2,3,4,5,6,7,8,9) 
y<-c(1,1,2,2,2,3,3,3,3) 
classNames<-c("B1","B2","A1","A2","A3","C1","C2","C3","C4") 
classColors<-c("darkorange","darkorange3","cyan","blue","blue4","green1","green2","green3","green4") 
classShapes<-c(1,1,2,2,2,3,3,3,3) 

datadf<-data.frame(x,y,classNames,stringsAsFactors = FALSE) 

ggplot()+ 
    geom_point(data=datadf,aes(x=x,y=y,shape=classNames,color=classNames))+ 
    scale_color_manual(name="My classes",values=classColors)+ 
    scale_shape_manual(name="My classes",values=classShapes) 

Names in legend are ordered alphabetically not matching the order I specified in my data, so not matching my colors and shapes, and causing problem as I really need my legend items follows the same order as in my data.

Si j'utilise ce nom au lieu ggplot, correspond aux formes et couleurs et sont en bon ordre dans la légende, mais maintenant ils ne correspondent pas aux points du terrain ...

ggplot()+ 
    geom_point(data=datadf,aes(x=x,y=y,shape=classNames,color=classNames))+ 
    scale_color_manual(name="My classes",values=classColors,labels=classNames) + 
    scale_shape_manual(name="My classes",values=classShapes,labels=classNames) 

Now names in legend match shapes and colors as in my data, but now mismatch is in the plot x,y positions.

Répondre

0

L'ordre des éléments de légende dépend de l'ordre des niveaux dans la variable de facteur définissant la légende.

library(ggplot2) 
    x<-c(1,2,3,4,5,6,7,8,9) 
    y<-c(1,1,2,2,2,3,3,3,3) 
    classNames<-c("B1","B2","A1","A2","A3","C1","C2","C3","C4") 
    classColors<-c("darkorange","darkorange3","cyan","blue","blue4","green1","green2","green3","green4") 
    classShapes<-c(1,1,2,2,2,3,3,3,3) 

datadf<-data.frame(x,y,classNames,stringsAsFactors = FALSE) 
#defining the levels: 
datadf$classNames <- factor(datadf$classNames, levels = classNames) 


ggplot()+ 
    geom_point(data=datadf,aes(x=x,y=y,shape=classNames,color=classNames))+ 
    scale_color_manual(name="My classes",values = classColors)+ 
    scale_shape_manual(name="My classes",values = classShapes) 

enter image description here

Une autre approche consiste à définir la coloration manuellement:

ggplot()+ 
    geom_point(data=datadf,aes(x=x,y=y,shape=classNames,color=classNames))+ 
    scale_color_manual(name="My classes",values = c("A1" = "blue", "A2" = "red", "A3" = "orange", "B1" = "brown", "B2" = "black", "C1" = "grey50", "C2" = "pink", "C3" = "lightblue", "C4" = "green"))+ 
    scale_shape_manual(name="My classes",values= c("A1" = 1, "A2" = 2, "A3" = 3, "B1" = 4, "B2" = 5, "C1" = 6, "C2" = 7, "C3" = 8, "C4" = 9)) 

enter image description here

+0

Great! C'est le truc que j'ai manqué pendant trop de jours. Je vous remercie! – Mica

+0

Envisager de marquer comme accepté s'il a résolu votre problème. Merci – missuse