Изменить порядок легенды без изменения порядка точек на графике

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

производит:

пример

Таким образом, точки отображаются на графике как Cat2 = Z, Y, затем X (черные ромбы, синий треугольник, красный круг), но в легенде они отображаются как Cat2 = X, Y, затем Z (красный круг, синий треугольник, черный алмаз).

Как я могу изменить порядок легенды, не сдвигая точки на графике? Изменение порядка фактора создает противоположную проблему (точки на графике поменяны местами).

Спасибо!


person jslefche    schedule 26.09.2011    source источник
comment
На данный момент, наверное, нет простого пути. Однако в следующей версии может быть возможность изменить порядок легенды.   -  person kohske    schedule 26.09.2011
comment
Хм, воняет. Хорошо знать. Спасибо за внимание!   -  person jslefche    schedule 26.09.2011
comment
@hadley да, да. почему я это пропустил ???   -  person kohske    schedule 27.09.2011
comment
@jslefche, чтобы вы могли легко его изменить. извините за заблуждение.   -  person kohske    schedule 27.09.2011
comment
Извините за мое незнание, могу ли я установить разрывы для scale_x_discrete (Cat2)?   -  person jslefche    schedule 27.09.2011


Ответы (2)


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

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 разделил бы их на две легенды, а не объединял бы их.

person joran    schedule 13.06.2013
comment
Если у вас несколько ручных весов, например scale_fill_manual, scale_color_manual и scale_shape_manual, и вы хотите изменить метки, вам необходимо предоставить одинаковые метки для всех из них, что может быть утомительным (скажем, у вас есть 6 переменных с 6 длинными пояснительными метками). Нет другого выхода, не так ли? - person PatrickT; 11.10.2015

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

  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()
person Matthieu Dubois    schedule 26.09.2011
comment
Увы, как я похоронил в конце своего вопроса, изменение множителя меняет местами легенду, но также меняет местами точки на графике (красный кружок теперь первый). Я хочу сохранить порядок точек на графике, но перевернуть легенду. Я воспользовался вашим решением и просто скопировал легенду на первый участок. Неэлегантно, но это надо будет сделать. Спасибо все таки за понимание! - person jslefche; 26.09.2011