在热力图中突出显示单元格

5

我目前正在尝试设置矩阵的热力图,并基于另外两个矩阵来突出显示特定单元格。

一个例子:

> SOI
         NAP_G021 NAP_G033  NAP_G039 NAP_G120  NAP_G122
2315101  59.69418 27.26002  69.94698 35.22521  38.63995
2315102 104.15294 76.70379 114.72999 97.35930  79.46014
2315104 164.32822 61.83898 140.99388 63.25482 105.48041
2315105  32.15792 21.03730  26.89965 36.25943  40.46321
2315103  74.67434 82.49875 133.89709 93.17211  35.53019

> above150

         NAP_G021 NAP_G033  NAP_G039 NAP_G120  NAP_G122
2315101  0 0 0 0 0
2315102  0 0 0 0 0
2315104  1 0 0 0 0
2315105  0 0 0 0 0
2315103  0 0 0 0 0

> below30

         NAP_G021 NAP_G033  NAP_G039 NAP_G120  NAP_G122
2315101  0 1 0 0 0
2315102  0 0 0 0 0
2315104  0 0 0 0 0
2315105  0 1 1 0 0
2315103  0 0 0 0 0

现在我要创建一个普通的热力图:
heatmap(t(SOI), Rowv = NA, Colv = NA)

现在,我想要做的是突出显示单元格中above150为1的部分,并带上一个颜色框架(例如蓝色),而below30中为1的单元格则应该带上红框。当然,所有矩阵的大小都是相等的,因为它们是相关的。 我知道可以通过add.expr在处理后添加内容到热力图中,但是到目前为止,我只能创建跨越整个热力图的完整直线,这不是我想要的结果。 如果有任何建议,我会非常高兴。
1个回答

10
当调用add.expr时,图表被设置为使单元格的中心位于单位整数值处。尝试使用add.expr=points(1:5,1:5)查看。现在,您只需要编写一个函数,在半整数坐标处绘制所需颜色的框(帮助(rect))。
请尝试以下内容:
set.seed(310366)

nx=5
ny=6
SOI=matrix(rnorm(nx*ny,100,50),nx,ny)

colnames(SOI)=paste("NAP_G0",sort(as.integer(runif(ny,10,99))),sep="")
rownames(SOI)=sample(2315101:(2315101+nx-1))
above150 = SOI>150
below30=SOI<30

makeRects <- function(tfMat,border){
  cAbove = expand.grid(1:nx,1:ny)[tfMat,]
  xl=cAbove[,1]-0.49
  yb=cAbove[,2]-0.49
  xr=cAbove[,1]+0.49
  yt=cAbove[,2]+0.49
  rect(xl,yb,xr,yt,border=border,lwd=3)
}

heatmap(t(SOI),Rowv = NA, Colv=NA, add.expr = {
 makeRects(above150,"red");makeRects(below30,"blue")})

嘿,bontus,你能在我的答案旁边打勾来接受它吗?这样我就能得到一些积分,而你也会获得更好的声誉!我们喜欢答案! - Spacedman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接