Эта проблема похожа на на эту Я ответил. Это о тепловых картах в упаковке 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
может сделать асимметрию цветовой клавиши c. И затем вам нужно найти, где указанное значение (то есть 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)
для увидеть разницу.)