Цвет Pheatmap для конкретного значения

Я очень плохо знаком с R, и недавно я поиграл с библиотекой pheatmap, чтобы генерировать, ну, в общем, тепловые карты. Моя проблема в том, что я хочу раскрасить свою тепловую карту особым образом. Я опишу ниже:

  1. Значения < 1 должны быть цветовой шкалой (например, темно-синий или светло-синий)
  2. Значение, точно равное 1, должно быть темно-серым
  3. Значения> 1 должны быть цветовой шкалой (например, от темно-красного до светло-красного)

Я играл с breaks параметр и color параметр с различными палитрами, но я не могу найти хорошее решение. ближе всего я пришел что-то вроде этого:

pheatmap(mtx, 
     color =  c('#4444FF','#F4FF4F','#FF4444'), 
     breaks = c(0,1,2,3), 
     legend_breaks = c(0,1,2) )

Но это не позволяет визуализировать диапазоны, т. Е. 0,1 должно выглядеть иначе, чем 0,9, даже если они оба должны быть синими. Кто-нибудь может дать предложения или совет? Я посмотрел на этот билет и подумал об изменении 1 на NA, но это слишком сложно для меня. Не говоря уже о том, что мне пришлось бы отключить кластеризацию для pheatmap, что я не хочу делать. Спасибо!

1 ответ

Вы не можете установить цвет для определенного цвета, но вы можете пойти на очень маленький диапазон, как [0.999,1.001]

Следует установить разрывы для указанных диапазонов, упомянутых в вопросе, и назначить цвета соответствующим образом;

library(pheatmap)
bk1 <- c(seq(-2,0.9,by=0.1),0.999)
bk1 <- c(1.001,seq(1.1,3,by=0.1))
bk <- c(bk1,bk2)  #combine the break limits for purpose of graphing

my_palette <- c(colorRampPalette(colors = c("darkblue", "lightblue"))(n = length(bk1)-1),
              "gray38", "gray38",
              c(colorRampPalette(colors = c("darkred", "tomato1"))(n = length(bk2)-1)))

pheatmap(df, color = my_palette, breaks = bk, scale = "none", 
             cluster_rows = F, cluster_cols = F, margin = c(5,5))

В целях демонстрации примера использования rnorm.within Функция я сделала следующий набор данных:

   #V1 is random between -2 and 3 
   #V2 is equal to 1
   #V3 is random between 0 and 3

   df <- cbind(rnorm.within(1000, -2, 3),rep(1,1000), rnorm.within(1000,0,3))

И это будет тепловая карта для данных, созданных выше;

Другие вопросы по тегам