如何将矢量值与R中颜色渐变的颜色匹配?

如何将矢量值与R中颜色渐变的颜色匹配?,r,vector,transform,R,Vector,Transform,这在R中可能是一件微不足道的事情,但我找不到任何内置函数可以做到这一点: 如何在给定颜色渐变的情况下将值向量(比如数字值)转换为颜色向量。我上面评论中的想法可以通过seq()和cut()实现。第一步是在数据范围内创建相等间隔的容器 brks <- with(mtcars, seq(min(mpg), max(mpg), length.out = 65)) grps是一个系数,指示将数据中的每个观测值分配到哪个bin > head(grps) [1] (20.7,21] (20.

这在R中可能是一件微不足道的事情,但我找不到任何内置函数可以做到这一点:


如何在给定颜色渐变的情况下将值向量(比如数字值)转换为颜色向量。

我上面评论中的想法可以通过
seq()
cut()
实现。第一步是在数据范围内创建相等间隔的容器

brks <- with(mtcars, seq(min(mpg), max(mpg), length.out = 65))
grps
是一个系数,指示将数据中的每个观测值分配到哪个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"
另一种方法是使用
colorRamp()
,它返回一个函数,该函数插值一组提供的颜色。生成的函数取覆盖颜色渐变范围的[0,1]范围内的值。首先,我们生成一个颜色渐变函数,在红色和蓝色之间插值:

FUN <- colorRamp(c("red","blue"))
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"

你能给出一些示例数据吗?数字是如何表示的:1个数字还是RGBA通道的单独值?你想要什么颜色渐变(你说给定,那么你能给我们一个吗?)让我们假设我想将向量
mtcars$mpg
中的每个值与颜色渐变
terrain.colors(n=64)匹配
。我需要它将
mtcars$mpg
中的每个值转换为其颜色(如果使用颜色渐变
地形绘制)。颜色(n=64)
。您想如何进行匹配?将第一种颜色分配给最低的
mpg
,将
mpg
的最后一个值分配给最后一种颜色,然后通过将值范围分为64组将其他颜色分配给其中一种地形颜色?是的-我正在考虑一种简单的线性插值:第一种颜色将被影响到最小值,而最后一种颜色将表示向量中的最大值。向量中的每个其他值将根据64种颜色的线性组合给出。好的,谢谢。已经包含了一个这样做的答案。值得指出的是,如果您打算使用上面的颜色进行一些绘图,则lattice和ggplot2软件包提供了一致的打印功能,可以为您执行上述操作,尤其是ggplot2。@Gavin(+1)我认为
colorRampPalette()
可能也是一个不错的选择。@chl好的指针,尽管
colorRampPalette()
似乎更适合-
colorRampPalette()
类似于
terrain.colors()
等-当您为它提供要插值的颜色时,它返回一个函数,为范围内提供的数值提供颜色[0,1).仅供参考,colorRamp在我的经验中非常慢。@Gavin是的,我自己也是一个很重的ggplot2用户。我实际上正在编写一个生成KML的包,这就是为什么我不使用ggplot2例程的原因。然而,我想实现的正是Hadley的方法;用户正在指定一个颜色渐变(例如使用RColorBrewer)一个变量,函数会自动影响颜色。ggplot2中肯定有这样一个系统,但我在源代码中找不到。也许哈德利可以对此发表评论?
MPG <- with(mtcars, (mpg - min(mpg)) / diff(range(mpg)))
> 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
> 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"