温馨提示:本文翻译自stackoverflow.com,查看原文请点击:r - How to assign heatmap color range
heatmap r

r - 如何分配热图颜色范围

发布于 2020-05-01 15:54:12

我想绘制一个从-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)

查看更多

提问者
lxcfuji
被浏览
10
Darren Tsai 2020-02-13 09:36

这个问题类似于这一个我回答。这是关于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 = Fin 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)看到的不同。)