Как изменить цветовой диапазон 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)