2017-09-24 19 views
1

我正在创建一个情节,我需要在单个图例中混合使用名称,颜色和形状。 看来传说为我的数据按classname生成与我的班级形状和颜色不匹配的字母顺序排序...我需要为每个超类A,B,C设置独特的形状,所以我期望将A1,A2,A3作为三角形,并且B1,B2为圆圈。如何强制图例名称遵循与我的数据中的颜色和形状相同的顺序? (我不想在这没有意义的我的实际应用中的传奇字母顺序排列)保持我的数据在ggplot图例中的颜色和形状相结合的排序

这里我的数据和代码:

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.

如果我用这个代替ggplot,名称与形状和颜色相匹配,并提出在传说中的良好秩序,但现在他们不图中的点匹配...

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.

回答

0

图例项目的顺序取决于因子可变的水平顺序限定的图例。

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

另一种方法是定义手动着色:

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

太好了!这是我错过了很多天的诀窍。谢谢! – Mica

+0

如果解决了您的问题,请考虑标记为已接受。谢谢 – missuse