pheatmap: Цвет для NA

Использование пакета пакета R для рисования тепловых карт. Есть ли способ назначить цвет для NA в матрице ввода? Кажется, NA по умолчанию окрашивается в белый цвет. Например:

library(pheatmap)
m<- matrix(c(1:100), nrow= 10)
m[1,1]<- NA
m[10,10]<- NA
pheatmap(m, cluster_rows=FALSE, cluster_cols=FALSE)

Спасибо

4 ответа

Это возможно, но требует некоторого взлома.

Прежде всего, давайте посмотрим, как pheatmap рисует тепловую карту. Вы можете проверить это, просто набрав pheatmap в консоли и прокручивая вывод, или альтернативно используя edit(pheatmap),

Вы обнаружите, что цвета отображаются с помощью

mat = scale_colours(mat, col = color, breaks = breaks)

scale_colours функция, кажется, является внутренней функцией pheatmap пакет, но мы можем проверить исходный код, используя

getAnywhere(scale_colours)

Который дает

function (mat, col = rainbow(10), breaks = NA) 
{
    mat = as.matrix(mat)
    return(matrix(scale_vec_colours(as.vector(mat), col = col, 
        breaks = breaks), nrow(mat), ncol(mat), dimnames = list(rownames(mat), 
        colnames(mat))))
}

Теперь нам нужно проверить scale_vec_colours, это оказывается:

function (x, col = rainbow(10), breaks = NA) 
{
    return(col[as.numeric(cut(x, breaks = breaks, include.lowest = T))])
}

Итак, по сути, pheatmap использует cut решить, какие цвета использовать.

Давайте попробуем и посмотрим, что cut делает, если вокруг НС есть:

as.numeric(cut(c(1:100, NA, NA), seq(0, 100, 10)))
  [1]  1  1  1  1  1  1  1  1  1  1  2  2  2  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3
 [29]  3  3  4  4  4  4  4  4  4  4  4  4  5  5  5  5  5  5  5  5  5  5  6  6  6  6  6  6
 [57]  6  6  6  6  7  7  7  7  7  7  7  7  7  7  8  8  8  8  8  8  8  8  8  8  9  9  9  9
 [85]  9  9  9  9  9  9 10 10 10 10 10 10 10 10 10 10 NA NA

Это возвращает NA! Итак, вот ваша проблема!

Теперь, как мы можем обойти это? Проще всего позволить pheatmap нарисуйте тепловую карту, затем отложите значения NA, как нам нравится.

Снова глядя на pheatmap функция, которую вы увидите, использует grid пакет для построения графиков (см. также этот вопрос: R - Как добавить строки и текст в pheatmap?)

Так что вы можете использовать grid.rect добавить прямоугольники в позиции NA. То, что я хотел бы сделать, это найти координаты границы тепловой карты методом проб и ошибок, а затем поработать с ней, чтобы построить прямоугольники.

Например:

library(pheatmap)
m<- matrix(c(1:100), nrow= 10)
m[1,1]<- NA
m[10,10]<- NA

hmap <- pheatmap(m, cluster_rows=FALSE, cluster_cols=FALSE)
# These values were found by trial and error
# They WILL be different on your system and will vary when you change
# the size of the output, you may want to take that into account.
min.x <- 0.005
min.y <- 0.01
max.x <- 0.968
max.y <- 0.990
width <- 0.095
height <- 0.095

coord.x <- seq(min.x, max.x-width, length.out=ncol(m))
coord.y <- seq(max.y-height, min.y, length.out=nrow(m))

for (x in seq_along(coord.x))
  {
  for (y in seq_along(coord.y))
    {
    if (is.na(m[x,y]))
        grid.rect(coord.x[x], coord.y[y], just=c("left", "bottom"),
                  width, height, gp = gpar(fill = "green"))    
    }
  }

Лучшим решением было бы взломать код pheatmap с использованием edit работать и иметь дело с НС, как вы хотите...

Собственно, теперь вопрос простой. Текущая функция pheatmap включает параметр для назначения цвета "NA", na_col. Пример:

na_col = "grey90"

Вы можете включить назначение цвета, используя версию pheatmap для разработчиков из github. Вы можете сделать это используя devtools:

#this part loads the dev pheatmap package from github
if (!require("devtools")) {
  install.packages("devtools", dependencies = TRUE)
  library(devtools)
}
install_github("raivokolde/pheatmap")

Теперь вы можете использовать параметр "na_col" в функции pheatmap:

pheatmap(..., na_col = "grey", ...)

(редактировать) Не забудьте загрузить его потом. После установки вы можете рассматривать его как любой другой установленный пакет.

Если вы хотите, чтобы NA были серыми, вы можете просто сделать "NA" двойным.

m[is.na(m)] <- as.double("NA")
pheatmap(m, cluster_rows=F, cluster_cols=F)

Если вы не возражаете против использования heatmap.2 от gplots вместо этого есть удобный na.color аргумент. Взяв пример данных m сверху:

library(gplots)
heatmap.2(m, Rowv = F, Colv = F, trace = "none", na.color = "Green")
Другие вопросы по тегам