Выделите ячейки в тепловой карте - PullRequest
4 голосов
/ 02 ноября 2011

В настоящее время я пытаюсь настроить тепловую карту матрицы и выделить конкретные ячейки на основе двух других матриц.

Пример:

> 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 в above150 с рамкой одного цвета (например, синего цвета), в то время как ячейки с 1 в below30 должны получить красную рамку. Конечно, все матрицы одинакового размера, поскольку они связаны между собой. Я знаю, что могу добавить вещи в тепловую карту после обработки с помощью add.expr, но до сих пор мне только удалось создать полные абзацы, охватывающие всю тепловую карту =>, а не то, что я ищу.

Если у кого-нибудь есть какие-либо предложения, я был бы рад.

1 Ответ

9 голосов
/ 02 ноября 2011

Когда вызывается add.expr, график устанавливается таким образом, чтобы центр ячеек находился в единичных целочисленных значениях.Попробуйте add.expr = points (1: 5,1: 5), чтобы увидеть.Теперь все, что вам нужно сделать, это написать функцию, которая рисует прямоугольники (справка (прямоугольник)) с нужными цветами в полуцелых координатах.

Попробуйте это:

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")})
...