反转col2rgb和rgb2hsv

时间:2013-07-23 17:11:03

标签: r colors hsv

我正在将颜色转换为HSV以重新映射颜色。事实上,我使用gray.colors

生成渐变的灰色
(mydata <- 1 : 10) # For exposition only
cols <- gray.colors(max(mydata))

然而,我真正想要的是白红色而不是白黑色的渐变。稍微摆弄颜色选择器使我确信,为此,应该足以在灰度颜色上交换值和饱和度,然后将值设置为1(0的色调已经对应于红色)。

没有比这更容易了:

hsvc <-rgb2hsv(col2rgb(cols))
hsvc['s', ] <- hsvc['v', ]
hsvc['v', ] <- 1

但是,为了绘制这些值,我现在需要将它们转换回R颜色值。由于缺少hsv2col,我似乎无法做到这一点。当然,有hsv声称可以做到这一点,但你不能用上面hsvc的值来调用它 - 甚至没有一列:

hsv(hsvc[, 1]) # plots *three* (wrong) colour values instead of one

R不能直接使用HSV值:

plot(1, 1, pch = 20, col = cols[1])   # Works, grey dot
plot(1, 1, pch = 20, col = hsvc[, 1]) # Nothing plotted

如何从HSV值矩阵中恢复R可用的颜色值?

2 个答案:

答案 0 :(得分:2)

使用do.callas.list将数据传递给hsv的相关参数:

do.call(hsv,as.list(hsvc[,1]))
[1] "#FFB3B3"

plot(1,1, pch=20, col=do.call(hsv,as.list(hsvc[,1]))) # light red dot

为所有数据执行此操作:

plot(mydata,col=apply(hsvc,2,function(x) do.call(hsv,as.list(x)))) # a symphony of red

但似乎重新映射无法正常工作,因为强度变化不能在同一方向上起作用。

答案 1 :(得分:2)

你想:

> do.call(hsv, as.list(hsvc[, 1]))
[1] "#FFB2B2"

但是你真的需要概括一下,以便在hsvc的所有列上工作,那么如何:

sapply(data.frame(hsvc), function(x) do.call(hsv, as.list(x)))

给出了

> sapply(data.frame(hsvc), function(x) do.call(hsv, as.list(x))) 
       X1        X2        X3        X4        X5        X6        X7        X8 
"#FFB2B2" "#FF9393" "#FF7C7C" "#FF6969" "#FF5858" "#FF4A4A" "#FF3C3C" "#FF3030" 
       X9       X10 
"#FF2424" "#FF1919"

或者更好

> apply(hsvc, 2, function(x) do.call(hsv, as.list(x)))
 [1] "#FFB2B2" "#FF9393" "#FF7C7C" "#FF6969" "#FF5858" "#FF4A4A" "#FF3C3C"
 [8] "#FF3030" "#FF2424" "#FF1919