更改图例名称而不更改ggplot2中的颜色

时间:2012-12-12 20:28:33

标签: r 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)

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:9)

可以在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

答案 1 :(得分:1)

以下是一个可怕的,可怕的想法,并不能保证在所有情况下都有效:

plot1$scales$scales[[1]]$labels <- c("Distribution 1","Distribution 2","Distribution 3")
愿上帝怜悯你的灵魂。

没有人希望重构他们的代码。但是,当你已经达到了一个问题的明显,简单的解决方案突然不可能完全由于你现有的代码库的复杂性,这是正确的行动过程。

另一个更少冒犯的选择:

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

答案 2 :(得分:0)

如果您愿意使用一致的调色板,那么您可以将其定义为:

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

现在,而不是

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

使用

    values = mycolors