我目前正在尝试根据另外两个矩阵设置矩阵的热图并突出显示特定的单元格。
一个例子:
> 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)
现在我要做的是突出显示单元格{1}中的1和一种颜色的框架(例如蓝色),而above150
中的1的单元格应该得到一个红框。当然,所有矩阵的大小都相同,因为它们是相关的。我知道我可以在通过add.expr处理之后将内容添加到热图中,但到目前为止,我只是设法创建跨越整个热图的完整下标=>不是我想要的。
如果有人有任何建议我会很高兴。
答案 0 :(得分:9)
当调用add.expr时,将设置绘图,使单元格的中心为单位整数值。尝试使用add.expr = points(1:5,1:5)来查看。现在您需要做的就是编写一个函数,在半整数坐标处绘制所需颜色的框(help(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")})