比较R中两个矩阵的图表

时间:2010-09-22 17:19:12

标签: r matrix

我有两个矩阵(大约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个图中所需的区域,但我想做一些不同的事情,比如在第一个图上围绕这些区域划一条线,以便直接在那里突出显示它们。

知道我该怎么做吗?

谢谢 尼科

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])

你当然可以调整它来绘制圆圈,但更复杂的形状会很棘手。当感兴趣的区域相当紧凑时,它最有效。

百里