我想绘制一个从-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)
这个问题类似于这一个我回答。这是关于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
in heatmap.2
可以使色键不对称。然后,您需要找到指定值(即0)在数据中的位置。通过以下公式,您可以得到一个介于0〜1之间的值,以表示某个值的位置。
在这种情况下,(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)
看到的不同。)