2013-02-28 118 views
21

我注意到,这里Box and whiskers plot电话:更改ggplot因子颜色?

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

产生明亮的红/绿/蓝三色的箱图填补,而:

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

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

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

什么控制这组颜色ggplot使用以及如何改变呢?

感谢

回答

29

默认的颜色间隔均匀的色调在色轮上你可以检查这是如何从here产生

您可以使用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

但是,这并不能解释为什么一个变量绘成因素你得到一组颜色,并为不同的一个你会得到另一套颜色像我链接到的文档页面。颜色间隔均匀,我可以看到,但为什么它们之间有所不同?我希望它看起来像第一个不是第二个。 – user248237dfsf 2013-02-28 13:35:40

+0

能够手动设置色相轮上每种颜色之间的步距将会很好。这样我们可以在连续因素之间获得更大的对比。在360之后,它应该从0开始继续。 – JohannesNE 2015-05-28 10:51:29

5

添加到以前的答案:

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