Изменить порядок легенды без изменения порядка точек на сюжете - PullRequest
8 голосов
/ 26 сентября 2011

Я продолжаю сталкиваться с этой проблемой в 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 ]

4 голосов
/ 13 июня 2013

Чтобы конкретизировать комментарий Хэдли, мы сделаем что-то вроде этого:

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 голосов
/ 26 сентября 2011

Насколько я понимаю, чего ты хочешь достичь, эта простая манипуляция помогает мне:

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