Как изменить цветовой диапазон heatmap.2 в R?

Я использую gplot для создания тепловой карты, показывающей log2-кратные изменения групп лечения по сравнению с парным контролем. Со следующим кодом:

 heatmap.2(as.matrix(SeqCountTable), col=redgreen(75), 
           density.info="none", trace="none", dendrogram=c("row"), 
            symm=F,symkey=T,symbreaks=T, scale="none") 

Я вывожу тепловую карту с реальными значениями изменения смены (т.е. Не Row-Z score), что и есть то, что мне нужно, в цветовой схеме Red-Black-Green, которая является любителем всех биологов!

http://i.stack.imgur.com/uhFbP.jpg

Фактический диапазон изменения log2-fold - -3/+ 7, со многими значениями в диапазонах -2 / - 1 и +1/+ 2, которые отображаются как темно-красный/зеленый (соответственно). Это делает всю тепловую карту довольно темной и такой трудной для интерпретации.

  • Есть ли способ перекосить цветовой градиент, чтобы сделать его менее линейным? То есть, чтобы градиент от черного до довольно яркого происходил в меньшем диапазоне?
  • И/или изменить диапазон цветов, чтобы быть асимметричным, т.е. Работать с -3/+ 7, как это делают данные, а не -7/+ 7 в масштабе в настоящее время, с черным, все еще центрированным на ноль?

Ответ 1

Я получил диапазон цветов, чтобы быть асимметричным, просто изменив аргумент symkey на FALSE

symm=F,symkey=F,symbreaks=T, scale="none"

Исправлена проблема цвета с colorRampPalette с аргументом breaks для указания диапазона каждого цвета, например

colors = c(seq(-3,-2,length=100),seq(-2,0.5,length=100),seq(0.5,6,length=100))

my_palette <- colorRampPalette(c("red", "black", "green"))(n = 299)

в целом

heatmap.2(as.matrix(SeqCountTable), col=my_palette, 
    breaks=colors, density.info="none", trace="none", 
        dendrogram=c("row"), symm=F,symkey=F,symbreaks=T, scale="none")

Ответ 2

Вы можете попытаться создать свою собственную цветовую палитру, используя пакет RColorBrewer

my_palette <- colorRampPalette(c("green", "black", "red"))(n = 1000)

и посмотрим, как это выглядит. Но я предполагаю, что в вашем случае только масштабирование поможет, если вы действительно хотите, чтобы черный был "посередине". Вы можете просто использовать my_palette вместо redgreen()

Я рекомендую вам проверить пакет RColorBrewer, у них есть довольно красивые встроенные палитры и посмотреть интерактивный сайт для colorbrewer.

Ответ 3

Я думаю, вам нужно установить symbreaks = FALSE Это должно учитывать асимметричные цветовые масштабы.

Ответ 4

Здесь другой вариант для тех, кто не использует heatmap.2 (aheatmap - это хорошо!)

Сделайте последовательный вектор из 100 значений от min до max вашей входной матрицы, найдите значение, самое близкое к 0 в этом, сделайте два вектора цветов в и из желаемой средней точки, объедините и используйте их:

breaks <- seq(from=min(range(inputMatrix)), to=max(range(inputMatrix)), length.out=100)
midpoint <- which.min(abs(breaks - 0))
rampCol1 <- colorRampPalette(c("forestgreen", "darkgreen", "black"))(midpoint)
rampCol2 <- colorRampPalette(c("black", "darkred", "red"))(100-(midpoint+1))
rampCols <- c(rampCol1,rampCol2)