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