更改 ggplot 因子颜色

Posted

技术标签:

【中文标题】更改 ggplot 因子颜色【英文标题】:Change ggplot factor colors 【发布时间】:2013-02-14 08:19:03 【问题描述】:

我注意到这里有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 使用哪组颜色以及如何更改它?

【问题讨论】:

【参考方案1】:

默认颜色是围绕色轮均匀分布的色调。您可以检查这是如何从here 生成的。

您可以将scale_fill_manual 与这些颜色一起使用:

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

在这里,我使用来自cylggplot_build(p)$data 来获取颜色。

或者,您也可以像这样使用另一个调色板:

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 时,第一种颜色相同,但第二种颜色不同。这是因为它会生成 均匀分布 色调的颜色。如果您想为vs 使用cyl 的颜色,那么您必须设置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 生成的颜色,差异的原因也很明显。我希望这会有所帮助。

【讨论】:

但这并不能解释为什么将一个变量绘制为一个因子,你会得到一组颜色,而对于不同的变量,你会得到另一组颜色,就像我链接到的文档页面一样。颜色是均匀分布的,我可以看到,但是为什么两者之间的不同呢?我希望它看起来像第一个而不是第二个。 如果能够手动设置色相轮上每种颜色之间的步长,那就太好了。这样我们就可以在连续因素之间获得更大的对比。在 360 度之后,它应该只是从 0 开始。【参考方案2】:

添加到以前的答案:

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

【讨论】:

此方法在使用 scale_fill_manual() 时也适用于 geom_bar()。【参考方案3】:

你可以使用这些包:

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

【讨论】:

以上是关于更改 ggplot 因子颜色的主要内容,如果未能解决你的问题,请参考以下文章

基于 ggplot 列表中是不是存在因子的颜色代码

R语言可视化包ggplot2包通过因子变量设置图像颜色实战

ggplot 手动图例 scale_fill_manual 用于单独的颜色因子

R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据并自定义因子(factor)的图例颜色legend

更改 ggplotly() 重叠条形图中的条形颜色

手动更改ggplot的颜色