2011-09-26 81 views
8

我一直在ggplot2中遇到这个问题,也许有人可以帮助我。在不改变积分顺序的情况下重新排序图例

我有一个情节,图例中变量的顺序与它们在情节中的显示顺序相反。

例如:

df=data.frame(
mean=runif(9,2,3), 
Cat1=rep(c("A","B","C"),3), 
Cat2=rep(c("X","Y","Z"),each=3)) 

dodge=position_dodge(width=1) 
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
scale_color_manual(values=c("red","blue","black"))+ 
scale_shape_manual(values=c(16:19))+ 
coord_flip() 

生产:

example

所以点被显示在情节作为CAT2 = Z,Y,然后X(黑钻石,蓝色三角形,红圆形),但在图例中它们显示为Cat2 = X,Y,然后Z(红色圆圈,蓝色三角形,黑色菱形)。

如何在不改变图上的点的情况下颠倒图例的顺序?重新排列该因素会产生相反的问题(图上的点是相反的)。

谢谢!

+2

现在,可能没有简单的方法。不过,下一个版本可能会有一个反转图例顺序的选项。 – kohske

+0

嗯,那太臭了。很高兴知道。感谢您的领导! – jslefche

+1

设置比例尺“休息”。 – hadley

回答

0

据我了解你想要达到的目标,这个简单的操控确实为我的伎俩:

  1. 定义CAT2的一个因素(在适当的顺序水平)和
  2. 恰克的颜色和形状的以匹配水平顺序(在scale_manual命令)

下面是代码做到这一点:

library(ggplot2) 

df=data.frame(
    mean=runif(9,2,3), 
    Cat1=rep(c("A","B","C"),3), 
    Cat2=factor(rep(c("X","Y","Z"),each=3), levels=c('Z', 'Y', 'X'))) 

dodge=position_dodge(width=1) 
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
    geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
    scale_color_manual(values=c("black","blue","red"))+ 
    scale_shape_manual(values=c(18:16))+ 
    coord_flip() 
+0

唉,当我埋在我的问题的最后,扭转因素颠倒传说,但也扭转了剧情上的点(红圈现在是第一个)。我想保留剧情上的点的顺序,但要颠倒传说。我已经使用了你的解决方案,并将图例复制到第一个图上。不雅,但必须这样做。谢谢你的洞察力! – jslefche

3

为了充实哈德利的意见,我们会做这样的事情:

ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
scale_color_manual(values=c("red","blue","black"),breaks = c('Z','Y','X'))+ 
scale_shape_manual(values=c(16:19),breaks = c('Z','Y','X'))+ 
coord_flip() 

enter image description here

请注意,我们必须设定断裂处尺度。如果我们只做了一个,它们就不会匹配,ggplot会将它们分成两个传说,而不是合并它们。

+0

如果您有多个手动秤,例如'scale_fill_manual','scale_color_manual'和'scale_shape_manual',并且您希望更改标签,您需要为所有标签提供相同的标签,这可能非常乏味(比如说6个变量和6个长解释标签)。没有别的办法,是吗? – PatrickT

相关问题