2017-01-21 17 views
2

Я очень новичок в R, и недавно я играл с библиотекой fheatmap, чтобы генерировать, ну, карты тепла. Моя проблема заключается в том, что я хочу покрасить свою тепловую карту определенным образом. Я опишу ниже:Цвет 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, даже если они оба должны быть синим цветом. Может ли кто-нибудь давать предложения или советы? Я посмотрел на This ticket и рассмотрел возможность изменения 1 на NA, но для меня это слишком сложно. Не говоря уже о том, что мне придется отключить кластеризацию для pheatmap, что я не хочу делать. Благодаря!

+0

Пожалуйста, прочитайте [Почему я должен принять ответ?] (Https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – Masoud

+0

В случае кто-то столкнулись с этим вопросом с немного разными потребностями, обратитесь к этому вопросу: [Heatmap с настраиваемой шкалой цветовых шкал для значений ниже и выше пороговых значений] (https://stackoverflow.com/questions/44398360/heatmap-with-customized-color-scale -Бар-для значений ниже-и-выше порогов). – Masoud

ответ

0

Вы не можете установить цвет для определенного цвета, но вы можете пойти на очень небольшом диапазоне, как [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)) 

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