改变ggplot因子颜色?

时间:2013-02-28 08:09:09

标签: r ggplot2 visualization

我注意到Box and whiskers plot来电:

p + geom_boxplot(aes(fill = factor(cyl)))

为箱线图填充生成亮红色/绿色/蓝色,同时:

p + geom_boxplot(aes(fill = factor(vs)))

产生明显的浅绿色/红色。在我的数据中,我得到了第二组颜色,但是想要第一组颜色(比如

p + geom_boxplot(aes(fill = factor(cyl)))

什么控制ggplot使用哪种颜色,你如何改变它?

由于

3 个答案:

答案 0 :(得分:38)

默认颜色是色轮周围均匀分布的色调。您可以查看here

的生成方式

您可以scale_fill_manual使用这些颜色:

p + scale_fill_manual(values=c("#F8766D", "#00BA38"))

在这里,我使用ggplot_build(p)$data中的cyl来获取颜色。

或者,您也可以使用其他调色板:

p + scale_fill_brewer(palette="Set1")

要查找调色板中的颜色,您可以执行以下操作:

require(RColorBrewer)
brewer.pal(9, "Set1")

如果您有兴趣,请检查包装是否知道调色板和其他选项。

编辑: @ user248237dfsf,因为我已经在顶部的链接中指出,@Andrie的这个功能显示了生成的颜色:

ggplotColours <- function(n=6, h=c(0, 360) +15){
  if ((diff(h)%%360) < 1) h[2] <- h[2] - 360/n
    hcl(h = (seq(h[1], h[2], length = n)), c = 100, l = 65)
}

> ggplotColours(2)
# [1] "#F8766D" "#00BFC4"

> ggplotColours(3)
# [1] "#F8766D" "#00BA38" "#619CFF"

如果你看一下生成的两种颜色,第一种颜色是相同的,但是当n = 2且n = 3时,第二种颜色是不一样的。这是因为它生成均匀间隔色调的颜色。如果您想使用cyl vs的颜色,那么您必须设置scale_fill_manual并使用此函数中使用n = 3生成的这些颜色。

要确认这确实是您正在做的事情:

p1 <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
           geom_boxplot(aes(fill = factor(cyl)))

p2 <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
           geom_boxplot(aes(fill = factor(vs)))

现在,如果你这样做:

ggplot_build(p1)$data[[1]]$fill
# [1] "#F8766D" "#00BA38" "#619CFF"

ggplot_build(p2)$data[[1]]$fill
# [1] "#F8766D" "#00BFC4" "#F8766D" "#00BFC4" "#F8766D"

您会看到这些是使用ggplotColours生成的颜色,差异的原因也很明显。我希望这会有所帮助。

答案 1 :(得分:7)

添加到之前的答案:

使用col美学(而不是fill)时,请使用scale_color_manual。这对geom_point()

非常有用
myColors <- c("#56ddc5", "#ff3db7", "#4699dd")
ggplot(mtcars, aes(x=mpg, y=hp, col=as.factor(cyl))) + 
  geom_point() +
  scale_color_manual(values=myColors)

enter image description here

答案 2 :(得分:0)

你可以使用这些包:

#install.packages(pals)
#install.packages(reshape2)
require(pals)
require(reshape2)

在这里您可以找到一些示例直接调色板:

pal.bands(alphabet, alphabet2, cols25, glasbey, kelly, okabe, polychrome, 
stepped, stepped2, stepped3, tol, watlington,
        main="Discrete", show.names=FALSE)

你可以像这样应用它们:

 p +
   scale_fill_manual(values=as.vector(stepped3(20)))