改变ggplot因子颜色

45
我注意到这里箱线图的呼叫:
p + geom_boxplot(aes(fill = factor(cyl)))

生成明亮的红/绿/蓝颜色用于盒形图填充,而:
p + geom_boxplot(aes(fill = factor(vs)))

生成一组独特的淡绿色/红色颜色。在我的数据中,我得到了第二组颜色,但希望得到第一组(就像在...中)。
p + geom_boxplot(aes(fill = factor(cyl)))

什么控制ggplot使用哪个颜色集,并且如何更改它?
3个回答

58

默认颜色是绕着色轮均匀分布的色调。您可以从这里查看其生成方式。

您可以使用这些颜色与scale_fill_manual搭配使用:

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

在这里,我使用ggplot_build(p)$datacyl中获取颜色。

或者,您也可以使用另一个调色板,方法如下:

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生成的,差异的原因也很明显。希望这可以帮到你。


2
但这并不能解释为什么对于一个被绘制为因子的变量,你得到一组颜色,而对于另一个不同的变量,你得到另一组颜色,就像我链接的文档页面上。颜色是均匀分布的,我可以看出来,但为什么两者之间不同呢?我想让它看起来像第一个而不是第二个。 - user248237
能够手动设置色相环上每种颜色之间的步骤将是很好的。这样我们就可以在连续的因素之间获得更大的对比度。在360之后,它应该从0继续。 - JohannesNE

9

补充之前的答案:

当使用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


当使用scale_fill_manual()时,这种方法也适用于geom_bar()。 - David M Vermillion

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接