2011-11-02 5 views
4

J'essaie actuellement de mettre en place une carte thermique d'une matrice et de mettre en évidence des cellules spécifiques, sur la base de deux autres matrices.Mettre en surbrillance des cellules dans heatmap

Un exemple:

> 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 

Maintenant, je crée un heatmap normal:

heatmap(t(SOI), Rowv = NA, Colv = NA) 

Maintenant ce que je veux faire est de mettre en évidence les cellules, qui ont un 1 above150 avec un cadre d'un couleur (par exemple bleu), tandis que les cellules avec un below30 1 devraient obtenir un cadre rouge. Toutes les matrices sont de taille égale car elles sont liées. Je sais que je peux ajouter des choses à la heatmap après le traitement via add.expr, mais jusqu'à présent, j'ai juste réussi à créer des ablines complètes qui couvrent l'ensemble du heatmap => pas ce que je cherche.

Si quelqu'un a des suggestions, je serais ravi.

Répondre

9

Lorsque add.expr est appelé, le tracé est défini de sorte que le centre des cellules soit à des valeurs entières unitaires. Essayez add.expr = points (1: 5,1: 5) pour voir. Maintenant tout ce que vous avez à faire est d'écrire une fonction qui dessine des cases (help (rect)) avec les couleurs dont vous avez besoin, aux coordonnées demi-entières.

Essayez ceci:

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 réponse de Nice, avec le code transparent propre. –

+0

thx. J'attends juste que ce novice ait le frisson de la première tique ... – Spacedman

+0

Excellente solution, exactement ce que je cherchais, merci beaucoup :) – bontus

Questions connexes