2011-11-02 57 views
4

我目前正在嘗試設置矩陣的熱圖並突出顯示基於其他兩個矩陣的特定單元格。突出顯示熱圖中的單元格

一個例子:

> 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處理後將東西添加到熱圖中,但到目前爲止,我只是設法創建了跨整個熱圖的完整ablines =>而不是我正在尋找的。

如果有人有任何建議,我會很高興。

回答

9

當調用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")}) 
+1

+1尼斯的答案,用乾淨透明的代碼。 –

+0

thx。只是等待那個新手得到第一個打勾的快感... – Spacedman

+0

偉大的解決方案,正是我所尋找的,非常感謝你:) – bontus

相關問題