Изменение имен легенд без изменения цвета в ggplot2

Я хотел бы переименовать значения в легенде, не изменяя уже настроенные цвета. Есть ли способ установить метки легенды без использования scale_color_manual? В настоящее время у меня есть что-то вроде этого:

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

Это, однако, перезаписывает ручные цвета. Я буду менять имена в другой функции, где я устанавливаю цвета, поэтому, к сожалению, я не смогу использовать scale_color_manual (values ​​=..., labels =...). Другой вариант, о котором я думал, - это как-то получить цвета, используемые в plot1. Тогда я мог бы сделать что-то вроде:

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

Любая помощь будет высоко оценена. Спасибо!

Ответ 1

Можно указать имена ярлыков в 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

Ответ 2

Далее следует ужасная, страшная идея, которая не гарантирует работу во всех случаях:

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

Пусть Бог помилует вашу душу.

Никто не хочет реорганизовывать свой код. Но когда вы достигли точки, когда очевидное, простое решение проблемы внезапно невозможно исключительно из-за сложности вашей существующей базы кода, это правильный ход действий.

Другой, несколько менее оскорбительный вариант:

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

Ответ 3

Если вы хотите использовать согласованную цветовую палитру, вы можете определить это как:

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

Теперь вместо

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

использование

    values = mycolors