我有两个矩阵(大约300 x 100),我想绘制一个图表,看第一个的部分高于第二个部分。
我可以做,例如:
# Calculate the matrices and put them into m1 and m2
# Note that the values are between -1 and 1
par(mfrow=c(1,3))
image(m1, zlim=c(-1,1))
image(m2, zlim=c(-1,1))
image(m1-m2, zlim=c(0,1))
这将仅绘制第3个图中所需的区域,但我想做一些不同的事情,比如在第一个图上围绕这些区域划一条线,以便直接在那里突出显示它们。
知道我该怎么做吗?
谢谢 尼科
答案 0 :(得分:2)
怎么样:
par(mfrow = c(1, 3))
image(m1, zlim = c(-1, 1))
contour(m1 - m2, add = TRUE)
image(m2, zlim = c(-1, 1))
contour(m1 - m2, add = TRUE)
image(m1 - m2, zlim = c(0, 1))
contour(m1 - m2, add = TRUE)
这会在区域周围添加等高线图。在第3个区域的区域周围放置环(可能想要摆弄轮廓的(n)级别以获得更少的“圆圈”)。
答案 1 :(得分:1)
制作第三张图片的另一种方法可能是:
image(m1>m2)
这会生成一个TRUE / FALSE值矩阵,其值为0/1,因此您有一个双色图像。尽管如此,仍然不确定你的“放线”......
答案 2 :(得分:1)
这是我写的一些类似代码的代码。我想通过在它们周围绘制一个框来突出显示0.95阈值以上的连续区域,因此我得到了0.95以上的所有网格方块并对它们进行了聚类。然后对聚类输出进行一些调整以获得区域的矩形坐标:
computeHotspots = function(xyz, thresh, minsize=1, margin=1){
### given a list(x,y,z), return a data frame where each row
### is a (xmin,xmax,ymin,ymax) of bounding box of a contiguous area
### over the given threshhold.
### or approximately. lets use the clustering tools in R...
overs <- which(xyz$z>thresh,arr.ind=T)
if(length(overs)==0){
## found no hotspots
return(NULL)
}
if(length(overs)==2){
## found one hotspot
xRange <- cbind(xyz$x[overs[,1]],xyz$x[overs[,1]])
yRange <- cbind(xyz$y[overs[,2]],xyz$y[overs[,2]])
}else{
oTree <- hclust(dist(overs),method="single")
oCut <- cutree(oTree,h=10)
oXYc <- data.frame(x=xyz$x[overs[,1]],y=xyz$y[overs[,2]],oCut)
xRange <- do.call("rbind",tapply(oXYc[,1],oCut,range))
yRange <- do.call("rbind",tapply(oXYc[,2],oCut,range))
}
### add user-margins
xRange[,1] <- xRange[,1]-margin
xRange[,2] <- xRange[,2]+margin
yRange[,1] <- yRange[,1]-margin
yRange[,2] <- yRange[,2]+margin
## put it all together
xr <- apply(xRange,1,diff)
xm <- apply(xRange,1,mean)
xRange[xr<minsize,1] <- xm[xr<minsize]-(minsize/2)
xRange[xr<minsize,2] <- xm[xr<minsize]+(minsize/2)
yr <- apply(yRange,1,diff)
ym <- apply(yRange,1,mean)
yRange[yr<minsize,1] <- ym[yr<minsize]-(minsize/2)
yRange[yr<minsize,2] <- ym[yr<minsize]+(minsize/2)
cbind(xRange,yRange)
}
测试代码:
x=1:23
y=7:34
m1=list(x=x,y=y,z=outer(x,y,function(x,y){sin(x/3)*cos(y/3)}))
image(m1)
hs = computeHotspots(m1,0.95)
那会给你一个矩形坐标矩阵:
> hs
[,1] [,2] [,3] [,4]
1 13 15 8 11
2 3 6 17 20
3 22 24 18 20
4 13 16 27 30
现在你可以使用rect:
在图像上绘制它们image(m1)
rect(hs[,1],hs[,3],hs[,2],hs[,4])
并表明他们应该在哪里:
image(list(x=m1$x,y=m1$y,z=m1$z>0.95))
rect(hs[,1],hs[,3],hs[,2],hs[,4])
你当然可以调整它来绘制圆圈,但更复杂的形状会很棘手。当感兴趣的区域相当紧凑时,它最有效。
百里