【问题标题】:Graph to compare two matrices in R用于比较 R 中的两个矩阵的图表
【发布时间】:2010-09-22 17:19:11
【问题描述】:

我有两个矩阵(大约 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))

这将仅在第三个图中绘制所需的区域,但我想做一些不同的事情,例如在第一个图上的这些区域周围画一条线,以便在那里直接突出显示它们。

知道我该怎么做吗?

谢谢 妮可

【问题讨论】:

  • 嗯,你有点含糊 - 你能画出你想要的东西(因为我们看不到你的 m1 和 m2 矩阵)然后发布吗?
  • @Spacedman:是的,抱歉,这有点难以解释......我想绘制 m1 并在 m1>m2 的区域周围画一条线(如等高线图)

标签: r matrix


【解决方案1】:

怎么样:

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)

这会在区域周围添加等高线图。在第三个图的区域周围放置环(可能想要摆弄轮廓的 (n) 级以获得更少的“圆圈”)。

【讨论】:

  • 其实使用levels参数设置为0似乎效果不错
【解决方案2】:

制作第三张图片的另一种方法可能是:

image(m1>m2)

这会产生一个由 TRUE/FALSE 值组成的矩阵,该矩阵被成像为 0/1,因此您有一个双色图像。不过,仍然不确定您的“绕线”的事情...

【讨论】:

    【解决方案3】:

    这是我写的一些代码来做类似的事情。我想通过在它们周围画一个框来突出显示高于 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])
    

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

    巴里

    【讨论】:

    • 在您的示例中,尝试: image(m1);轮廓(m1,add=TRUE,levels=0.8)
    • 看起来很酷!我唯一的问题是阈值本身就是一个矩阵,但我想我可以从你的代码中得到一些好主意。谢谢!
    猜你喜欢
    • 2016-08-03
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多