2011-09-26 13 views
8

Ciągle napotykam ten problem w ggplot2, może ktoś może mi pomóc.Zmieniaj kolejność legend bez zmiany kolejności punktów na działce.

Mam działkę, w której kolejność zmiennych w legendzie jest odwrotna do tego, w jaki sposób są wyświetlane na wykresie.

Na przykład:

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

sporządza:

example

więc punkty są wyświetlane na powierzchni, jak Cat2 = Z, Y, wówczas X (czarne romby, niebieski trójkąt, czerwony koło), ale w legendzie są wyświetlane jako Cat2 = X, Y, a następnie Z (czerwone kółko, niebieski trójkąt, czarny diament).

Jak zmienić kolejność legendy bez zmiany punktów na wykresie? Zmiana kolejności czynnika powoduje przeciwny problem (punkty na wykresie są odwrócone).

Dzięki!

+2

Na razie prawdopodobnie nie ma łatwego sposobu. Następna wersja może jednak mieć opcję odwrócenia kolejności legendy. – kohske

+0

Hmm, to śmierdzi. Dobrze wiedzieć. Dzięki za heads up! – jslefche

+1

Ustaw skalę 'breaks'. – hadley

Odpowiedz

0

O ile rozumiem, co chcesz osiągnąć, to prosta manipulacja robi trick dla mnie:

  1. zdefiniować cat2 jako czynnik (z poziomami w odpowiedniej kolejności) i
  2. chage kolejność kolorów i kształtów, aby dopasować kolejność poziomów (w scale_manual poleceń)

Oto kod, aby to zrobić:

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

Niestety, jak zakopałem na końcu mojego pytania, cofnięcie czynnika odwraca legendę, ale także odwraca punkty na wykresie (czerwone kółko jest teraz pierwsze). Chcę zachować porządek punktów na fabule, ale odwrócić legendę. Użyłem twojego rozwiązania i po prostu skopiowałem legendę na pierwszy plan. Nieelegancki, ale będzie musiał to zrobić. Dzięki za wgląd! – jslefche

3

Aby ucieleśnić komentarz Hadley, chcielibyśmy zrobić coś takiego:

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

Zauważ, że musieliśmy ustawić przerwy w obu skalach. Gdybyśmy zrobili tylko jeden, nie pasowaliby, a ggplot podzieliłby je na dwie legendy, zamiast je scalić.

+0

Jeśli masz kilka skal manualnych, np. 'scale_fill_manual',' scale_color_manual' oraz 'scale_shape_manual' i chcesz zmienić etykiety, musisz dostarczyć te same etykiety do wszystkich, co może być uciążliwe (powiedzmy, że masz 6 zmiennych z 6 długimi etykietami objaśniającymi). Nie ma innej drogi, prawda? – PatrickT