如何分配热图颜色范围

时间:2020-02-12 04:55:59

标签: r heatmap

我想绘制一个范围为 -2到6,且0为白色的双色热图。 我的代码给了我一个对称的颜色范围,显然我的热图太亮了。 我尝试使用symbreaks = F,但是0不是白色;我还尝试过手动分配两种颜色,但两种颜色都不起作用。

colfunc1 <- colorRampPalette(brewer.pal(8, "Blues"))
colfunc2 <- colorRampPalette(brewer.pal(8, "Reds"))
hmcols <- c(colfunc1(25), colfunc2(25*(max(data) - 1)))

这是我用来生成以下热图的代码。 请指教! 谢谢!

heatmap.2(as.matrix(data), Colv=FALSE, scale = T, dendrogram = "row", trace = "none",
          col = hmcol, key = T, cexCol = 1.5, cexRow = 1, srtCol = 15)

1 个答案:

答案 0 :(得分:0)

此问题类似于我回答的this one。这与highcharter包中的热图有关。区别在于highcharter分配颜色更方便。我使用相同的概念来解决这种heatmap.2情况。

样本数据

x <- rnorm(1000, 2, 1.5)
x[x < -2] <- -2
x[x > 6] <- 6
mat <- matrix(x, 20, 50)

说明

首先,在symkey = F, symbreaks = F中使用heatmap.2可以使颜色键不对称。然后,您需要找到指定值(即0)在数据中的位置。通过以下公式,您可以得到一个介于0〜1之间的值,以表示某个值的位置。

foo+bar

在这种情况下,(0-(-2))/(6-(-2))为0.25。如果有100个断点,则需要串联100 * 0.25 = 25红色和100 - 25 = 75蓝色。您会发现白色将与零保持一致。

library(gplots)
library(RColorBrewer)

hmcol <- function(n){
  colfun1 <- colorRampPalette(rev(brewer.pal(9, "Reds")))
  colfun2 <- colorRampPalette(brewer.pal(9, "Blues"))
  p <- (0 - min(mat)) / (max(mat) - min(mat))
  gap <- n * p
  c(colfun1(floor(gap)), colfun2(n - gap))
}

heatmap.2(mat, trace = "none", symkey = F, symbreaks = F, col = hmcol(50))

您可以在hmcol()中设置任何数字来指示断点的数量。(您可以尝试col = hmcol(10)col = hmcol(100)来查看差异。)