如何在R中生成从数字到颜色的映射?

如何在R中生成从数字到颜色的映射?,r,colors,R,Colors,在R中,我可以轻松生成颜色渐变,例如colorRampPalette。以下生成了从蓝色到红色的五种颜色序列: > mypal <- colorRampPalette( c( "blue", "red" ) )( 5 ) > mypal [1] "#0000FF" "#3F00BF" "#7F007F" "#BF003F" "#FF0000" 我通常做如下的事情 mypalette[ findInterval( x, seq( 0, 10, length.out= 6 ), r

在R中,我可以轻松生成颜色渐变,例如colorRampPalette。以下生成了从蓝色到红色的五种颜色序列:

> mypal <- colorRampPalette( c( "blue", "red" ) )( 5 )
> mypal
[1] "#0000FF" "#3F00BF" "#7F007F" "#BF003F" "#FF0000"
我通常做如下的事情

mypalette[ findInterval( x, seq( 0, 10, length.out= 6 ), rightmost.closed= T ) ]
但也许有更好的解决方案OOB,自动为数字向量生成色标。

您可以尝试

> colorRampPalette(c('blue', 'red'))(length(x))[rank(x)]
[1] "#0000FF" "#FF0000" "#CC0032" "#3300CC" "#660099" "#990065"

我在R-Forge上的配色方案包实现了以下功能:


它的主要目的是创建将数值(不仅仅是整数色数)映射到颜色的函数。一旦安装了vignette,它就是最好的文档。

这里有一个map2color函数:

map2color<-function(x,pal,limits=NULL){
    if(is.null(limits)) limits=range(x)
    pal[findInterval(x,seq(limits[1],limits[2],length.out=length(pal)+1), all.inside=TRUE)]
}


 map2color(0:11,rainbow(200),limits=c(1,10))
[1] "#FF0000FF" "#FF0000FF" "#FFA800FF" "#ADFF00FF" "#05FF00FF" "#00FFA3FF"
[7] "#00ABFFFF" "#0003FFFF" "#A600FFFF" "#FF00B0FF" "#FF0008FF" "#FF0008FF"
 map2color(0:11,rainbow(200))
[1] "#FF0000FF" "#FF8A00FF" "#EBFF00FF" "#61FF00FF" "#00FF29FF" "#00FFB3FF"
[7] "#00BAFFFF" "#0030FFFF" "#5900FFFF" "#E300FFFF" "#FF0091FF" "#FF0008FF"


mypal <- colorRampPalette( c( "blue", "red" ) )( 5 )
x <- c( 1, 9, 8.5, 3, 3.4, 6.2 )
map2color(x,mypal)
"#0000FF" "#FF0000" "#FF0000" "#3F00BF" "#3F00BF" "#BF003F"

map2color我能想到的最简单的事情是用
cut
离散变量x,然后使用合成因子索引调色板,如
heat.colors
cm.colors

f <- function(x,n=10){
    heat.colors(n)[cut(x,n)]
}

f但这与OP结果不同,不是吗?不,这不起作用,接近的数字应该有非常相似的颜色。以c(1,2,3200)为例;前三个数字都应该接近颜色标量的开头,使用第三个等级已经是蓝色的。这可能不能解决一月的问题,但它解决了不同的问题,如果你想在1、2、3和200的情况下区分所有数字,你可能会在HCL颜色空间和不同的亮度中有更多的运气,请参见
?hcl
听起来很有趣!请问你为什么不把它交给CRAN?(我不能用install.packages安装它,必须使用svn)这是一个相当快速的临时黑客攻击,文档有点垃圾,我希望它可能会获得一些动力和使用-但它从来没有…是的,但我会,也没有找到它,因为它不在CRAN上:-)遗憾的是,包“配色方案”不可用(适用于R版本3.1.1)。
map2color<-function(x,pal,limits=NULL){
    if(is.null(limits)) limits=range(x)
    pal[findInterval(x,seq(limits[1],limits[2],length.out=length(pal)+1), all.inside=TRUE)]
}


 map2color(0:11,rainbow(200),limits=c(1,10))
[1] "#FF0000FF" "#FF0000FF" "#FFA800FF" "#ADFF00FF" "#05FF00FF" "#00FFA3FF"
[7] "#00ABFFFF" "#0003FFFF" "#A600FFFF" "#FF00B0FF" "#FF0008FF" "#FF0008FF"
 map2color(0:11,rainbow(200))
[1] "#FF0000FF" "#FF8A00FF" "#EBFF00FF" "#61FF00FF" "#00FF29FF" "#00FFB3FF"
[7] "#00BAFFFF" "#0030FFFF" "#5900FFFF" "#E300FFFF" "#FF0091FF" "#FF0008FF"


mypal <- colorRampPalette( c( "blue", "red" ) )( 5 )
x <- c( 1, 9, 8.5, 3, 3.4, 6.2 )
map2color(x,mypal)
"#0000FF" "#FF0000" "#FF0000" "#3F00BF" "#3F00BF" "#BF003F"
f <- function(x,n=10){
    heat.colors(n)[cut(x,n)]
}