我想绘制一个范围为 -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)
答案 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之间的值,以表示某个值的位置。
在这种情况下,(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)
来查看差异。)