重新排列图例而不改变图表上点的顺序

9

我在使用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
嗯,那很糟糕。好知道。谢谢你提醒! - jslefche
@hadley 是的,是的。我怎么错过了它??? - kohske
@jslefche 这样你就可以轻松修改它了。对于误导我感到抱歉。 - kohske
抱歉我的无知,我是否需要为scale_x_discrete("Cat2")设置breaks? - jslefche
2个回答

6
为了补充 Hadley 的评论,我们会像这样做:

拓展 Hadley 的评论,我们会按照以下步骤进行:

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()

请在此输入图片描述

请注意,我们需要在两个比例尺上设置间断点。如果只设置其中一个,它们不会匹配,ggplot会将它们分成两个图例而不是合并它们。


如果您有多个手动比例尺,例如 scale_fill_manualscale_color_manualscale_shape_manual,并且希望更改标签,则需要向它们所有的比例尺提供相同的标签,这可能很繁琐(假设您有6个变量和6个长的解释性标签)。难道没有其他方法吗? - PatrickT

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()

唉,正如我在问题的末尾所提到的,反转因子会颠倒图例,但也会颠倒图表上的点(红色圆圈现在是第一个)。 我想保留图表上的点的顺序,但是颠倒图例。 我已经使用了您的解决方案,并将图例复制到了第一个图表上。 不太优雅,但这样做就可以了。 非常感谢您的见解! - jslefche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接