2011-09-26 11 views
8

Continuo a riscontrare questo problema in ggplot2, forse qualcuno può aiutarmi.Riordina la legenda senza cambiare l'ordine dei punti sulla trama

Ho un grafico in cui l'ordine delle variabili nella legenda è in ordine inverso rispetto al modo in cui vengono visualizzate sulla trama.

Ad esempio:

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

produce:

example

Così i punti vengono visualizzati sulla trama come Cat2 = Z, Y, allora X (diamanti neri, triangolo blu, rosso cerchio) ma nella legenda vengono visualizzati come Cat2 = X, Y, quindi Z (cerchio rosso, triangolo blu, diamante nero).

Come è possibile invertire l'ordine della legenda senza spostare i punti sul grafico? Riordinare il fattore produce il problema opposto (i punti sulla trama sono invertiti).

Grazie!

+2

Per ora, probabilmente non esiste un modo semplice. La prossima versione potrebbe avere un'opzione per invertire l'ordine della legenda, però. – kohske

+0

Hmm, che puzza. Buono a sapersi. Grazie per il testa a testa! – jslefche

+1

Imposta la scala 'interruzioni'. – hadley

risposta

0

Per quanto ho capito cosa si vuole raggiungere, questa semplice manipolazione fa il trucco per me:

  1. definire un Cat2 come un fattore (con i livelli nell'ordine adeguato) e
  2. chage l'ordine di colori e forme per abbinare l'ordine livelli (nei comandi scale_manual)

Ecco il codice per farlo:

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

Purtroppo, come ho sepolto alla fine della mia domanda, l'inversione del fattore inverte la legenda ma inverte anche i punti sulla trama (il cerchio rosso è ora il primo). Voglio mantenere l'ordine dei punti sulla trama ma invertire la leggenda. Avevo usato la tua soluzione e ho appena copiato la legenda sul primo grafico. Inelegante, ma dovrà fare. Grazie per l'intuizione lo stesso! – jslefche

3

per rimpolpare il commento di Hadley, vorremmo fare qualcosa di simile:

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

Si noti che abbiamo dovuto impostare le pause in entrambi scale. Se ne facessimo uno solo, non corrisponderebbero, e ggplot li dividerebbe in due leggende, invece di fonderli.

+0

Se si dispone di diverse scale manuali, ad es. 'scale_fill_manual',' scale_color_manual' e 'scale_shape_manual' e vuoi cambiare le etichette, devi fornire le stesse etichette a tutti loro, il che può essere noioso (ad esempio hai 6 variabili con 6 lunghe etichette esplicative). Non c'è altro modo, c'è? – PatrickT

Problemi correlati