我有一个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”
答案 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)
答案 1 :(得分:20)
如果您需要区分这么多(30+)个不同的类别,您可能需要备份并花更多时间从战略角度思考项目:几乎不可能想出一套30个colo(u )rs实际上是可区分的(特别是以独立于平台/渲染通道的方式)。
基本上没有适用于Set2
和30多种颜色的解决方案。一些CB调色板(Set3
和Paired
; 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种可区分的颜色将会非常困难......