2012-04-05 8 views
18

Mi sono imbattuto in questo comportamento strano con l'ordinamento delle leggende di ggplot2 e non riesco a capire quale sia la logica dietro il posizionamento automatico delle legende è:Ordinamento di più legende/guide (qual è la logica automatica e come modificarla?)

Il mio obiettivo: in un grafico con più scale, desidero sistemarli in un ordine diverso (tematico) rispetto a quello automatico. Ma non sono riuscito a trovare un comando in opts() o guides() per fare questo per me. E tanto per essere chiari: non voglio cambiare gli elementi all'interno delle legende, che funziona bene, ma la disposizione di più legende complete.

Quindi, per prima cosa ho pensato che fossero ordinati per tipo, cioè scala, colore, ecc. Ma non è questo il caso, la loro posizione cambia (vedi sotto).

Ordine alfabetico? No.

library(ggplot2) ## v0.9 

    ## Scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "A") + scale_colour_discrete(name = "B") 

    ## Reverse names --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "B") + scale_colour_discrete(name = "A") 

    ## Change name B to C --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "C") + scale_colour_discrete(name = "A") 

    ## Change name B to D --> scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "D") + scale_colour_discrete(name = "A") 

altre posizioni di scale_colour (per scambiati nome scale_size)

  • "E": peggiori
  • "F" - "L": all'inizio
  • "M" - "N": in basso

e continua ad apparire in alto a nella parte inferiore.

Ordine fattuale? No.

## From top to bottom: C - B - A 
    fname <- factor(c("A","B","C"), levels = c("A","B","C")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("C","B","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("B","C","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

Lunghezza del titolo? No. Mi fermo per ora con il codice di esempio, ma anche questo ha prodotto ordini fluttuanti indipendenti dalla lunghezza del carattere.

Qualche idea?

+1

È interessante notare che, per la prima serie di esempi, anteporre uno spazio a ciascun nome * * fa apparire le legende in ordine alfabetico. (es .: 'scale_size (name =" B ") + scale_colour_discrete (name =" C ")'). * Quel metodo *, però, fallisce ancora quando ci sono più di due leggende da sistemare ... –

+1

Sarò molto interessato alla risposta a questa domanda, anche se ho il sospetto che richieda a qualcuno come Kohske o Hadley di pesare. Non sono riuscito a trovare alcuna discussione su questo dalla mailing list, ma sembra che qualcosa sarebbe dovuto accadere ad un certo punto. – joran

+0

Purtroppo, ora l'ordine delle finestre delle legende dipende dall'hash di esse, quindi non c'è modo di prevedere l'ordine ... Sicuramente questa è una cattiva idea della mia implementazione. I (o Hadley o WCH) risolveranno questo problema nella versione futura. – kohske

risposta

17

Come ho detto nel commento precedente, non c'è modo di controllare e prevedere la posizione della casella della legenda. Non ero a conoscenza di questo problema. Grazie per aver chiarito questo.

Forse alcune persone hanno bisogno di controllare la casella leggenda, qui ho messo una soluzione rapida:

# run this code before calling ggplot2 function 
guides_merge <- function(gdefs) { 
    gdefs <- lapply(gdefs, function(g) { g$hash <- paste(g$order, g$hash, sep = "z"); g}) 
    tapply(gdefs, sapply(gdefs, function(g)g$hash), function(gs)Reduce(guide_merge, gs)) 
} 
environment(guides_merge) <- environment(ggplot) 
assignInNamespace("guides_merge", guides_merge, pos = "package:ggplot2") 

e quindi è possibile utilizzare order argomento per guide_legend (e anche guide_colorbar),

# specify the order of the legend. 
qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 1), colour = guide_legend(order = 2), alpha = guide_legend(order = 3)) 

qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 3), colour = guide_legend(order = 1), alpha = guide_legend(order = 2)) 

L'argomento order deve essere un numero intero positivo. Le leggende sono disposte secondo l'ordine. Nota che questa è una soluzione rapida, quindi l'interfaccia potrebbe essere cambiata nella prossima versione ufficiale di ggplot2.

+6

Kohske fornisce una versione aggiornata di questa risposta (che utilizza le modifiche implementate in ggplot2 poiché questa risposta è stata data) a http://stackoverflow.com/a/11397958/892313 –

Problemi correlati