R中的RGB等效image()函数?

时间:2014-06-03 17:08:55

标签: r image plot data-visualization

我正在运行模拟,相互竞争两种类型的代理。我们称这些代理为“红色”和“蓝色”。有三种可能的结果:红色胜利,蓝色胜利或每个人都输了。我们也要说,系统依赖于两个参数:X和Y。

我想要做的是创建一个伪彩色图,将结果编码为X和Y的函数。

  • 每个点的色调都是红色或蓝色获胜的可能性,因为有人获胜。如果蓝色总是赢,那就是蓝色;如果红色总是赢,那就是红色;等。

  • 饱和度是任何人获胜的概率。因此,如果没有人在X和Y的某个值上获胜,那么这一点将是灰色的(无论如何,在HSV模型中)。

编辑:所以我们假设我们使用HSV模型编码为here。 (不一定是那样,但是我们可以说它是。)纯蓝色是HSV空间中的(240,100,100),纯红色是(360,100,100)。同样假设,红色赢得50%的时间,蓝色赢得25%的时间,没有人赢得25%的时间。那么这一点将是(330,75,100)。

请注意,我并不担心从HSV转换为RGB - 为此,我可以使用col2rgb(hsv(...))。问题在于密谋本身。据我所知,image()函数只能编码一个信息通道;这是两个渠道的信息。

此外,结果是X和Y的连续函数,所以我想在值之间进行插值。 (如果重要的话,我正在使用'akima'软件包。)因此,我发现here的解决方案对我没有帮助(我认为)。

我很高兴使用任何套餐。我也很高兴不使用R,只要结果很好并且不太参与。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

这是一次尝试。我非常怀疑这是最好的方式,但理论上它是可能的。我只是手动创建不同的颜色级别,并将每个观察值分配给正确的颜色级别。

#put two "channels" of informaion in matrices
mpRed<-matrix(runif(5*5), nrow=5)
mpAny<-matrix(runif(5*5), nrow=5)

#define break points for colors/saturation
colBr<-seq(0,1, length.out=3)
satBr<-seq(0,1,length.out=5)

#now categorize observed values
vcRed<-cut(mpRed, colBr, labels=F)
vcAny<-cut(mpAny, satBr, labels=F)
vcComb<-as.numeric(interaction(vcRed, vcAny))
mcComb<-matrix(vcComb, ncol=ncol(mpAny))

#create colors for each of the levels
cols<-as.vector(outer(colBr[-1], satBr[-1], 
    FUN=function(a,b) hsv(ifelse(a>.5,1,.667),b,1)))

#make plot
with(dd, image(mcComb, col=cols, breaks=(0:length(cols))+.5))

resulting plot

答案 1 :(得分:2)

如果您可以使用rgb值创建数组(尺寸1和2指的是矩阵,尺寸3是红色,绿色和蓝色组件),那么您可以使用rasterImage函数绘制它。 / p>

一个简单的例子(我将把hsv转换为&gt; rgb给你):

red <- matrix( runif(100), 10, 10 )
blue <- matrix( runif(100), 10, 10 )

rgb.mat <- array( dim=c(10,10,3) )
rgb.mat[ , ,1 ] <- red
rgb.mat[ , ,2 ] <- 0
rgb.mat[ , ,3 ] <- blue

plot.new()
plot.window(xlim=c(0,1),ylim=c(0,1))
rasterImage( rgb.mat, 0,0,1,1 )  # interpolate
rasterImage( rgb.mat, 0,0,1,1, interpolate=FALSE ) # don't