如何将矢量值与R中的色带中的颜色进行匹配?

| 在R中这可能是一件微不足道的事情,但是我找不到能做到这一点的内置函数: 在给定色带的情况下,如何将值的向量(例如数值)转换为颜色的向量。     
已邀请:
        我上面的评论中的想法可以通过
seq()
cut()
来实现。第一步是在数据范围内创建相等间隔的区间
brks <- with(mtcars, seq(min(mpg), max(mpg), length.out = 65))
现在,我们将每个观察值分配给由休息点
brks
形成的bin中的一个
grps <- with(mtcars, cut(mpg, breaks = brks, include.lowest = TRUE))
“ 5”是指示将数据中的每个观测值分配给哪个bin的因数
> head(grps)
[1] (20.7,21]   (20.7,21]   (22.5,22.9] (21,21.4]   (18.5,18.8]
[6] (17.7,18.1]
64 Levels: [10.4,10.8] (10.8,11.1] (11.1,11.5] ... (33.5,33.9]
由于
grps
在内部存储为整数
1:nlevels(grps))
,我们可以使用此整数索引色带:
> terrain.colors(64)[grps]
 [1] \"#CADF00FF\" \"#CADF00FF\" \"#E6D90EFF\" \"#D3E100FF\" \"#96D300FF\"
 [6] \"#85CF00FF\" \"#3CBA00FF\" \"#E8C133FF\" \"#E6D90EFF\" \"#9ED500FF\"
[11] \"#85CF00FF\" \"#67C700FF\" \"#76CB00FF\" \"#51C000FF\" \"#00A600FF\"
[16] \"#00A600FF\" \"#43BC00FF\" \"#F1D6D3FF\" \"#EFBEACFF\" \"#F2F2F2FF\"
[21] \"#DCE300FF\" \"#51C000FF\" \"#51C000FF\" \"#29B400FF\" \"#9ED500FF\"
[26] \"#EBB16EFF\" \"#EAB550FF\" \"#EFBEACFF\" \"#58C300FF\" \"#AFD900FF\"
[31] \"#4ABE00FF\" \"#D3E100FF\"
另一种选择是使用
colourRamp()
,它返回一个对一组提供的颜色进行插值的函数。产生的函数的取值范围为[0,1),该值覆盖了色带范围。首先,我们生成一个颜色渐变函数,该函数在红色和蓝色之间进行插值:
FUN <- colorRamp(c(\"red\",\"blue\"))
然后,我们获取输入数据并将其设置为[0,1)间隔:
MPG <- with(mtcars, (mpg - min(mpg)) / diff(range(mpg)))
然后,我们使用
FUN()
生成颜色:
> cols <- FUN(MPG)
> head(cols)
         [,1]      [,2] [,3]
[1,] 139.9787 115.02128    0
[2,] 139.9787 115.02128    0
[3,] 120.4468 134.55319    0
[4,] 135.6383 119.36170    0
[5,] 164.9362  90.06383    0
[6,] 171.4468  83.55319    0
FUN()
返回的对象是红色,绿色和蓝色通道的值矩阵。要将这些转换为R可以使用的十六进制代码,我们使用
rgb()
函数:
> rgb(cols, maxColorValue=256)
 [1] \"#8B7300\" \"#8B7300\" \"#788600\" \"#877700\" \"#A45A00\" \"#AB5300\"
 [7] \"#D42A00\" \"#679700\" \"#788600\" \"#9F5F00\" \"#AE5000\" \"#BD4100\"
[13] \"#B34B00\" \"#CA3400\" \"#FE0000\" \"#FE0000\" \"#D02E00\" \"#10EE00\"
[19] \"#26D800\" \"#00FE00\" \"#867800\" \"#C73700\" \"#CA3400\" \"#DF1F00\"
[25] \"#9F5F00\" \"#47B700\" \"#55A900\" \"#26D800\" \"#C43A00\" \"#996500\"
[31] \"#CC3200\" \"#877700\"
    

要回复问题请先登录注册