我正在将颜色转换为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可用的颜色值?
答案 0 :(得分:2)
使用do.call
和as.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