在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,自动为数字向量生成色标。
答案 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.colors
或cm.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/
其主要目的是创建将数值(不仅仅是整数颜色数字)映射到颜色的函数。安装好后,小插图就是最好的文档。