Как назначить диапазон цветов карты - PullRequest
1 голос
/ 12 февраля 2020

Я хочу нарисовать двухцветную тепловую карту с диапазоном от -2 до 6, а 0 - белым . мой код дает мне симметричную цветовую гамму c, и, очевидно, моя тепловая карта слишком светлая. Я пытался использовать 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 голосов
/ 12 февраля 2020

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

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) для увидеть разницу.)

...