2012-12-12 18 views
10

Ändern würde Ich mag die Werte in einer Legende benennen, ohne die benutzerdefinierten Farben zu verändern, die bereits festgelegt worden sind. Gibt es eine Möglichkeit, Legendenbeschriftungen ohne scale_color_manual zu erstellen? Derzeit habe ich etwas in der Art:ändern Legende Namen ohne Farben 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")) 

Dies jedoch überschreibt die manuellen Farben. Ich werde die Namen in einer anderen Funktion seinen Wechsel von wo ich Farben, so setze ich leider werde scale_color_manual nicht nutzen kann (Wert = ..., labels = ...). Die andere Option, an die ich gedacht habe, ist, irgendwie die Farben von plot1 zu bekommen. Ich könnte dann etwas tun wie:

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

Jede Hilfe wäre sehr geschätzt. Vielen Dank!

Antwort

8

Es ist möglich, die Markennamen in scale_colour_manual angeben.

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

Die OP entschied dies aus, die, meiner Meinung nach, ist das eigentliche Problem. Sie haben sich mit ihrem anderen Code in eine Ecke gemalt. Die wirkliche Lösung besteht also darin, dass der OP seinen Code so umgestaltet, dass diese Lösung funktioniert. – joran

+0

Danke Jungs, leider würde ich lieber nicht umgestalten. Das Umbenennen der Labels erfolgt in einer separaten Funktion. Diese Funktion nimmt viele verschiedene Diagramme auf, die alle eindeutige Farben haben. Die Plots (zusammen mit den Farben) werden in vielen verschiedenen Funktionen erstellt. Ich möchte in der Lage sein, nur diese Funktion anzuwenden, um die neuen Namen zu bestimmen und dann umzubenennen. Irgendwelche anderen Vorschläge? Vielen Dank! – Taylor

1

Was folgt, ist eine schreckliche, schreckliche Idee, die nicht garantiert ist in allen Fällen zu arbeiten:

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

Gott wäre deine Seele gnädig hat.

Niemand will um ihren Code zu refaktorieren. Aber wenn man einen Punkt erreicht hat, wo die offensichtliche, einfache Lösung für ein Problem allein wegen der Komplexität der vorhandenen Codebasis plötzlich unmöglich ist, das ist die richtige Vorgehensweise.

Eine andere, etwas weniger offensive Option:

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

Wenn Sie bereit sind, eine konsistente Farbpalette zu verwenden, dann könnte man diese definieren als:

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

Statt nun

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

Verwendung

values = mycolors 
Verwandte Themen