9

在 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

4 回答 4

11

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

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

于 2013-09-11T19:12:45.320 回答
6

我在 R-Forge 上的配色方案包是这样做的:

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

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

于 2013-02-21T16:01:35.077 回答
6

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

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

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

这个函数会给你对应的颜色向量与x不同的粒度成正比n

于 2016-03-15T18:04:24.037 回答
3

你可以试试

> colorRampPalette(c('blue', 'red'))(length(x))[rank(x)]
[1] "#0000FF" "#FF0000" "#CC0032" "#3300CC" "#660099" "#990065"
于 2013-02-21T15:49:37.343 回答