2012-12-12 15 views
10

Desidero ridenominare i valori in una legenda senza alterare i colori personalizzati che sono già stati impostati. C'è un modo per impostare le etichette delle legende senza usare scale_color_manual? Attualmente, ho qualcosa di simile:Modifica dei nomi delle legende senza cambiare i colori in ggplot2

norm <- rnorm(1000, 0 , .5) 
gam <- rgamma(1000, 2) 
beta <- rbeta(1000, 2, 3) 
dist <- data.frame(Normal = norm, Gamma = gam, Beta= beta) 
dat <- melt(dist, variable.name = "Distribution", value.name = "XValue") 
plot1 <- ggplot(dat, aes(XValue, color = Distribution)) + 
      stat_density(geom = "path", position = "identity", size = 2) + 
      scale_color_manual(values = c("yellow", "black", "forestgreen")) 

plot2 <- plot1 + scale_color_discrete(labels = c("Distribution 1", 
           "Distribution 2", 
          "Distribution 3")) 

Questo tuttavia sovrascrive i colori manuali. Cambierò i nomi in una funzione diversa da quella in cui sto impostando i colori, quindi, sfortunatamente, non potrò usare scale_color_manual (values ​​= ..., labels = ...). L'altra opzione che ho pensato è di ottenere in qualche modo i colori usati in plot1. Ho potuto quindi fare qualcosa di simile:

colors <- plot1$colors_used 
plot2 <- plot1 + scale_color_manual(labels = c("Distribution 1", 
               "Distribution 2", 
         "Distribution 3"), 
             values = colors) 

Qualsiasi aiuto sarebbe molto apprezzato. Grazie!

risposta

8

È possibile specificare i nomi delle etichette in scale_colour_manual.

ggplot(dat, aes(XValue, color = Distribution)) + 
    stat_density(geom = "path", position = "identity", size = 2) + 
    scale_color_manual(values = c("yellow", "black", "forestgreen"), 
        labels = c("Distribution 1", 
           "Distribution 2", 
           "Distribution 3")) 

enter image description here

+0

L'OP ha escluso questo, che, IMHO, è il vero problema. Si sono dipinti in un angolo con il loro altro codice. Quindi la vera soluzione è che l'OP rafforzi il proprio codice in modo tale che questa soluzione funzioni. – joran

+0

Grazie ragazzi, sfortunatamente, preferirei non rifattore. La rinomina delle etichette verrà eseguita in una funzione separata. Questa funzione prenderà molti grafici diversi che hanno tutti colori unici. I grafici (insieme ai colori) verranno creati in molte diverse funzioni. Mi piacerebbe essere in grado di applicare questa funzione solo per determinare i nuovi nomi e quindi rinominare. Qualche altro suggerimento? Grazie! – Taylor

1

Quello che segue è una terribile, terribile idea che non è garantito per funzionare in tutti i casi:

plot1$scales$scales[[1]]$labels <- c("Distribution 1","Distribution 2","Distribution 3") 

Che Dio abbia pietà della vostra anima.

Nessuno desidera il ref. per il codice. Ma quando hai raggiunto un punto in cui l'ovvia, semplice soluzione a un problema è improvvisamente impossibile solo a causa delle complessità della tua base di codice esistente, quella è la linea d'azione corretta.

Un'altra opzione un po 'meno offensivo:

levels(dat$Distribution) <- c("Distribution 1","Distribution 2","Distribution 3") 
plot1 %+% dat 
0

Se siete disposti a utilizzare una tavolozza di colori coerente, allora si potrebbe definire questo come:

mycolors <- c("red", "blue", "black", #ee4747, #fff382, #f1f6c8, #334d65, #263825) 

Ora, invece di

values = c("yellow", "black", "forestgreen") 

uso

values = mycolors 
Problemi correlati