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

wes*_*erA 21 r colors ggplot2 colorbrewer

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

如何将黑色分配给一个值(scale_fill_brewer)并使用scale_fill_brewer分配其余颜色?(所有其他df $类型都是从1到X的整数集合,其中X是唯一值的数量)

到目前为止,我已经能够通过计算出scale_fill_brewer用于N个不同项目的颜色集然后预先设置颜色黑色并将其传递给我来手动执行此操作df$type == -1.

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)
Run Code Online (Sandbox Code Playgroud)

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

就像是:

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

谢谢!

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

And*_*rie 36

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

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

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

[1] "#EFF3FF" "#BDD7E7" "#6BAED6" "#3182BD" "#08519C"
Run Code Online (Sandbox Code Playgroud)

您可以在?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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Ben*_*ker 20

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

基本上没有可以使用Set230多种颜色的解决方案.一些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()
Run Code Online (Sandbox Code Playgroud)

我认为这样做效果相当好(Set3如果你愿意的话,你可以用13种颜色代替).唯一的缺点(我能想到的)是9和10种颜色的图形之间的不连续性.

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

  • 更有趣/更具挑战性的解决方案是找到一组在亮度= 65时均落在HCL楔内并且尽可能均匀间隔/远离的点.不是微不足道的...... (2认同)
  • http://tools.medialab.sciences-po.fr/iwanthue/是我上面评论的一个很好的实现.我认为`rainbow_hcl`,就像ggplot的颜色方案一样,在适当的颜色空间的边缘*周围给出相等的间距值...好,但不是绝对我想到的,这是*用*填充*颜色空间均匀间隔点 (2认同)