2015-09-13 2 views
1

Скажем:Определить конкретное значение окраски с pheatmap в R

m1<-matrix(rnorm(1000),ncol=100) 

и определение цветов:

cols = colorRampPalette(c("white", "red"))(30) 

Я производящий Heatmap без кластеризация с функцией pheatmap:

pheatmap(dist(t(m1)), cluster_rows = F, cluster_cols = F, show_rownames = TRUE, 
color = cols, main = 'Heatmap') 

вопрос в том, как я могу определить цвета, чтобы получить одну и ту же тепловую карту, но только с пикселями определенного значения (например, менее 0,1).

Я попытался установить

cols = ifelse(dist(t(m1))<0.1,'red','black') 

, но не работает.

ответ

3

Для простой бинарной цветовой гаммы, вы можете использовать breaks аргумент:

library(pheatmap) 

set.seed(1) 
m1<-matrix(c(rnorm(1000)), ncol=100) 

pheatmap(dist(t(m1)), 
     cluster_rows = F, 
     cluster_cols = F, 
     show_rownames = TRUE, 
     color = c("red", "black"), 
     breaks = c(0, 3, 9), # distances 0 to 3 are red, 3 to 9 black 
     main = 'Heatmap') 

Это выглядит следующим образом:

enter image description here

Если вы предпочитаете цветовые градиенты, это может быть сделано следует:

m <- matrix(c(rnorm(1000)), ncol=100) 
distmat <- dist(t(m)) 

# Returns a vector of 'num.colors.in.palette'+1 colors. The first 'cutoff.fraction' 
# fraction of the palette interpolates between colors[1] and colors[2], the remainder 
# between colors[3] and colors[4]. 'num.colors.in.palette' must be sufficiently large 
# to get smooth color gradients. 
makeColorRampPalette <- function(colors, cutoff.fraction, num.colors.in.palette) 
{ 
    stopifnot(length(colors) == 4) 
    ramp1 <- colorRampPalette(colors[1:2])(num.colors.in.palette * cutoff.fraction) 
    ramp2 <- colorRampPalette(colors[3:4])(num.colors.in.palette * (1 - cutoff.fraction)) 
    return(c(ramp1, ramp2)) 
} 

cutoff.distance <- 3 
cols <- makeColorRampPalette(c("white", "red", # distances 0 to 3 colored from white to red 
           "green", "black"), # distances 3 to max(distmat) colored from green to black 
          cutoff.distance/max(distmat), 
          100) 

pheatmap(distmat, 
     cluster_rows = F, 
     cluster_cols = F, 
     show_rownames = TRUE, 
     color = cols, 
     main = 'Heatmap') 

Которая тогда выглядит li ке это:

enter image description here

+0

Привет @WhiteViking, я попробовал это, и это было для обработки более чем на полчаса, пока я не остановил его. Я работаю с Rstudio в MacBook 1,4 ГГц Intel Core i5. Кроме того, для меня неплохо иметь только красные точки на черном фоне. – Kwnwps

+0

@ Kwnwps Я добавил пример, используя двоичную цветовую схему (красные точки на черном). – WhiteViking

+0

@ Kwnwps Что касается длительного времени обработки: это случается для этого примера игрушек? Или только для гораздо большего набора данных - если да, то какой размер? – WhiteViking

2

Не то, что вы просили, но вот ggplot решение, которое может помочь кому-то еще.

set.seed(1)   # for reproducible example 
m1 <- matrix(rnorm(1000),ncol=100) 
d <- dist(t(m1)) 

library(ggplot2) 
library(reshape2) # for melt(...) 
gg.df <- melt(as.matrix(d), varnames=c("row","col")) 

# fill is red for value < 3; black for value >= 3 
ggplot(gg.df, aes(x=factor(col), y=factor(row)))+ 
    geom_tile(aes(fill=ifelse(value<3, "below", "above")), color=NA)+ 
    scale_fill_manual("Threshold",values=c(below="#FF0000", above="#000000"))+ 
    coord_fixed() 

# fill is black for value > 3; gradient white to red for value <= 3 
ggplot(gg.df, aes(x=factor(col), y=factor(row)))+ 
    geom_tile(aes(fill=value), color=NA)+ 
    scale_fill_gradient(low="#FFFFFF", high="#FF0000", limits=c(0,3), na.value="black")+ 
    coord_fixed() 

Смежные вопросы