为一系列值指定颜色

时间:2014-03-07 16:27:59

标签: r

一个简单的问题,

我有一个带数字的向量,例如:

values <- c(0.104654225, 0.001781299, 0.343747296, 0.139326617, 0.375521201, 0.101218053)

我想为这个向量分配一个渐变比例,我知道我可以用

来做
gray(values/(max(values))

但我想使用蓝色色标,例如使用colorRampPalette或类似的东西,

由于

我注意到有几个类似主题的问题,但它们会映射间隔,我想将颜色映射到数值

2 个答案:

答案 0 :(得分:16)

修改 我现在认为使用colorRampPalette()colorRamp()更容易。

## Use n equally spaced breaks to assign each value to n-1 equal sized bins 
ii <- cut(values, breaks = seq(min(values), max(values), len = 100), 
          include.lowest = TRUE)
## Use bin indices, ii, to select color from vector of n-1 equally spaced colors
colors <- colorRampPalette(c("lightblue", "blue"))(99)[ii]

## This call then also produces the plot below
image(seq_along(values), 1, as.matrix(seq_along(values)), col = colors,
      axes = F)

在基本R函数中,colorRamp()是您正在寻找的。正如dg99所说,它返回一个函数,将[0,1]范围内的值映射到一系列颜色。

不幸的是,它返回了一个RGB值矩阵,大多数R的绘图函数都无法直接使用它。这些函数中的大多数都采用col=参数,该参数“希望”sRGB值在字符串中表示为十六进制值,看起来像"#E4E4FF""#9F9FFF"。要获得那些,您需要将rgb()函数应用于colorRamp()返回的矩阵。这是一个例子:

f <- colorRamp(c("white", "blue"))
(colors <- rgb(f(values)/255))
# [1] "#E4E4FF" "#FFFFFF" "#A7A7FF" "#DBDBFF" "#9F9FFF" "#E5E5FF"

在实践中,您可能希望同时使用颜色比例和值的缩放。

## Scale your values to range between 0 and 1
rr <- range(values)
svals <- (values-rr[1])/diff(rr)
# [1] 0.2752527 0.0000000 0.9149839 0.3680242 1.0000000 0.2660587

## Play around with ends of the color range
f <- colorRamp(c("lightblue", "blue"))
colors <- rgb(f(svals)/255)

## Check that it works
image(seq_along(svals), 1, as.matrix(seq_along(svals)), col=colors,
      axes=FALSE, xlab="", ylab="")

enter image description here

答案 1 :(得分:1)

我认为你正在寻找colorRamp而不是colorRampPalette,因为它将返回一个将从0-1开始对浮点运算的仿函数。根据{{​​3}}中示例部分的前几行,可能会尝试类似:

f <- colorRamp(c("white", "blue"))
colors <- f(values)

或只是

colors <- colorRamp(c("white", "blue"))(values)