我正在运行模拟,相互竞争两种类型的代理。我们称这些代理为“红色”和“蓝色”。有三种可能的结果:红色胜利,蓝色胜利或每个人都输了。我们也要说,系统依赖于两个参数: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,只要结果很好并且不太参与。
感谢您提供任何帮助。
答案 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))
答案 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