如何在ggplot2的scale_fill_brewer中更改一个值的颜色值?

时间:2011-05-20 16:48:29

标签: r ggplot2 colors colorbrewer

我有一个R数据帧(df),我将其绘制为ggplot2中的条形图,并根据数据框中的列(df$type)进行着色。现在,我使用默认着色模式(scale_fill_brewer)来分配颜色。

如何将黑色指定为一个值(df$type == -1)并使用scale_fill_brewer指定其余颜色? (所有其他df$types都是从1到X的整数集合,其中X是唯一值的数量)

到目前为止,我已经能够手动执行此操作,找出scale_fill_brewer用于N个不同项目的颜色集,然后将颜色预设为黑色并将其传递给scale_fill_manual

rhg_cols1<- c("#000000","#F8766D","#7CAE00","#00BFC4","#C77CFF" )
ggplot(y=values,data=df, aes(x=name, fill=factor(type))) + 
  geom_bar()+ scale_fill_manual(values = rhg_cols1)

问题是我需要一个无需手动分配颜色的解决方案,使用十六进制颜色计算器来计算scale_fill_brewer的十六进制值。

类似的东西:

ggplot(y=values,data=df, aes(x=name, fill=factor(type))) +
  geom_bar()+ scale_fill_brewer(value(-1, "black")

谢谢!

编辑:该解决方案必须适用于30多种颜色,适用于ColorBrewer的“Set2”

2 个答案:

答案 0 :(得分:35)

RColorBrewer包含调色板,您可以使用函数brewer.pal返回您选择的调色板。

例如,5种颜色的连续蓝色调色板:

library(RColorBrewer)
my.cols <- brewer.pal(5, "Blues")
my.cols

[1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C"

您可以在?brewer.pal帮助文件中获取有效调色板名称列表。这些名称与ColorBrewer网站上的名称相对应。

您现在可以使用或修改结果,并按照建议使用ggplot将结果传递给scale_manual_fill

my.cols[1] <- "#000000"

library(ggplot2)
df <- data.frame(x=1:5, type=1:5)
ggplot(df, aes(x=x, fill=factor(type))) +
    geom_bar(binwidth=1)+ 
    scale_fill_manual(values = my.cols)

enter image description here

答案 1 :(得分:20)

如果您需要区分这么多(30+)个不同的类别,您可能需要备份并花更多时间从战略角度思考项目:几乎不可能想出一套30个colo(u )rs实际上是可区分的(特别是以独立于平台/渲染通道的方式)。

基本上没有适用于Set2和30多种颜色的解决方案。一些CB调色板(Set3Paired; library(RColorBrewer); display.brewer.all(n=12))允许多达12种颜色。

编辑:OP希望使用良好的,可区分的颜色进行探索性数据分析,如果碰巧有很多类别则不会破坏。我会建议这样做:

library(RColorBrewer)
my.cols <- function(n) {
  black <- "#000000"
  if (n <= 9) {
    c(black,brewer.pal(n-1, "Set2"))
  } else {
    c(black,hcl(h=seq(0,(n-2)/(n-1),
                  length=n-1)*360,c=100,l=65,fixup=TRUE))
  }
}

library(ggplot2)
d <- data.frame(z=1:10)
g1 <- qplot(z,z,data=d,colour=factor(z))+opts(legend.position="none")
g1 + scale_colour_manual(values=my.cols(9))
g1 + scale_colour_manual(values=my.cols(10))
## check that we successfully recreated ggplot2 internals
## g1+scale_colour_discrete()

我认为这种方法运作得相当好(如果您愿意,可以用Set3替换13种颜色的截止值)。唯一的缺点(我能想到的)是9和10种颜色之间的不连续性。

提出一个更好的解决方案,以程序化的方式挑选N种可区分的颜色将会非常困难......