在R中,我可以轻松生成颜色渐变,例如colorRampPalette.以下产生五种颜色的序列,从蓝色到红色:
> mypal <- colorRampPalette( c( "blue", "red" ) )( 5 )
> mypal
[1] "#0000FF" "#3F00BF" "#7F007F" "#BF003F" "#FF0000"
Run Code Online (Sandbox Code Playgroud)
如何在此调色板上轻松映射数字向量?说,我有一个0到10之间的数字向量,像这样:
x <- c( 1, 9, 8.5, 3, 3.4, 6.2 )
Run Code Online (Sandbox Code Playgroud)
我想要一个功能,比如说map2color,当我跑步时map2color( mypal, x ),我会得到
#0000FF, #FF0000, #FF0000, #3F00BF, #3F00BF, #BF003F
Run Code Online (Sandbox Code Playgroud)
我通常做以下事情
mypalette[ findInterval( x, seq( 0, 10, length.out= 6 ), rightmost.closed= T ) ]
Run Code Online (Sandbox Code Playgroud)
但也许有更好的解决方案OOB,自动生成数字矢量的色标.
我在 R-Forge 上的 colourscheme 包是这样做的:
https://r-forge.r-project.org/projects/colourscheme/
它的主要目的是创建将数值(不仅仅是整数颜色数字)映射到颜色的函数。一旦你安装了小插图,它就是最好的文档。
这是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"
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西来创建一个在不同的数据样本中保持一致的colorramp,所以我添加了一个xlim参数.感谢您提问您的问题中的findInterval函数.
我能想到的最简单的事情是将变量x离散化cut,然后使用结果因子对调色板进行索引,例如heat.colors或cm.colors
f <- function(x,n=10){
heat.colors(n)[cut(x,n)]
}
Run Code Online (Sandbox Code Playgroud)
请参阅?heat.colors以了解调色板的更多详细信息。
此功能将为您提供与颜色向量x成比例的不同粒度n。