首页 文章

改变ggplot因子颜色?

提问于
浏览
28

我注意到这里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使用哪种颜色,你如何改变它?

谢谢

2 回答

  • 36

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

    你可以使用 scale_fill_manual 这些颜色:

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

    在这里,我使用了_256711_来自 cyl 来获取颜色 .

    或者,您可以使用另一个调色板,如下所示:

    p + scale_fill_brewer(palette="Set1")
    

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

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

    如果您有兴趣,请查看包裹以了解调色板和其他选项 .

    Edit: @ 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 生成的颜色,差异的原因也很明显 . 我希望这有帮助 .

  • 6

    添加到以前的答案:

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

相关问题