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

时间:2013-02-21 15:38:09

标签: r colors

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

> mypal <- colorRampPalette( c( "blue", "red" ) )( 5 )
> mypal
[1] "#0000FF" "#3F00BF" "#7F007F" "#BF003F" "#FF0000"

如何在此调色板上轻松映射数字向量?说,我有一个0到10之间的数字向量,如下所示:

x <- c( 1, 9, 8.5, 3, 3.4, 6.2 )

我想要一个函数,比如map2color,这样当我运行map2color( mypal, x )时,我得到了

#0000FF, #FF0000, #FF0000, #3F00BF, #3F00BF, #BF003F

我通常做类似以下的事情

mypalette[ findInterval( x, seq( 0, 10, length.out= 6 ), rightmost.closed= T ) ]

但也许有一个更好的解决方案OOB,自动为数字向量生成色标。

4 个答案:

答案 0 :(得分:5)

这是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"

我需要这样的东西来创建一个在不同的数据样本中保持一致的colorramp,所以我添加了一个xlim参数。感谢您在问题中提醒findInterval函数。

答案 1 :(得分:5)

我能想到的最简单的事情是使用cut将变量x离散化,然后使用结果因子来索引像heat.colorscm.colors

这样的调色板
f <- function(x,n=10){
    heat.colors(n)[cut(x,n)]
}

有关调色板的更多详细信息,请参阅?heat.colors

此函数将为您提供与x对应的颜色向量,其变化粒度与n成比例。

答案 2 :(得分:4)

你可以尝试

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

答案 3 :(得分:4)

我在R-Forge的colourscheme包中做到了:

https://r-forge.r-project.org/projects/colourscheme/

其主要目的是创建将数值(不仅仅是整数颜色数字)映射到颜色的函数。安装好后,小插图就是最好的文档。