2014-09-19 30 views
8

Isı paketlerini çizmek için R paketini kullanarak pheatmap. Giriş matrisinde NA'lara bir renk atamanın bir yolu var mı? NA varsayılan olarak beyaz renkte görünür. Örn .:pheatmap: NA için Renk

library(pheatmap) 
m<- matrix(c(1:100), nrow= 10) 
m[1,1]<- NA 
m[10,10]<- NA 
pheatmap(m, cluster_rows=FALSE, cluster_cols=FALSE) 

Teşekkür

cevap

10

mümkündür, ancak bazı kesmek gerektirir.

Her şeyden önce, pheatmap'un bir ısı haritası çizdiğini görelim. Bunu konsolda pheatmap yazarak ve çıkışta kaydırma yaparak veya alternatif olarak edit(pheatmap) kullanarak kontrol edebilirsiniz.

Sen renkler

mat = scale_colours(mat, col = color, breaks = breaks) 

scale_colours fonksiyon pheatmap paketin bir iç fonksiyonu gibi görünüyor kullanılarak eşlenir olduğunu göreceksiniz, ama biz verir kullanarak kaynak kodunu

getAnywhere(scale_colours) 

kontrol edebilirsiniz

function (mat, col = rainbow(10), breaks = NA) 
{ 
    mat = as.matrix(mat) 
    return(matrix(scale_vec_colours(as.vector(mat), col = col, 
     breaks = breaks), nrow(mat), ncol(mat), dimnames = list(rownames(mat), 
     colnames(mat)))) 
} 

Şimdi ihtiyacımız var scale_vec_colours kontrol o çıkıyor:

function (x, col = rainbow(10), breaks = NA) 
{ 
    return(col[as.numeric(cut(x, breaks = breaks, include.lowest = T))]) 
} 

Yani, aslında, pheatmapcut kullandığını Hangi renklerin karar vermek.

as.numeric(cut(c(1:100, NA, NA), seq(0, 100, 10))) 
    [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 
[29] 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 
[57] 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 
[85] 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 NA NA 

O NA verir:

deneyelim ve UA'lar etrafında varsa cut ne görelim! Yani, işte sorunun!

Şimdi, bunun etrafından nasıl geçeceğiz? En kolay şey, pheatmap'un ısı haritası çizmesine izin vermektir, ardından NA değerlerini istediğimiz gibi üst üste çizmektir.

Yani NA pozisyonlarına dikdörtgenler eklemek için grid.rect kullanabilirsiniz: pheatmap fonksiyonuna tekrar bakıldığında

bunu planlamaktan grid paketini (R - How do I add lines and text to pheatmap? de bu soruya bakın) kullanır göreceksiniz. Yapacağım şey, deneme ve hata ile ısı haritası sınırının koordinatlarını bulmak, ardından dikdörtgenleri çizmek için oradan çalışmaktır. Örneğin

:

library(pheatmap) 
m<- matrix(c(1:100), nrow= 10) 
m[1,1]<- NA 
m[10,10]<- NA 

hmap <- pheatmap(m, cluster_rows=FALSE, cluster_cols=FALSE) 
# These values were found by trial and error 
# They WILL be different on your system and will vary when you change 
# the size of the output, you may want to take that into account. 
min.x <- 0.005 
min.y <- 0.01 
max.x <- 0.968 
max.y <- 0.990 
width <- 0.095 
height <- 0.095 

coord.x <- seq(min.x, max.x-width, length.out=ncol(m)) 
coord.y <- seq(max.y-height, min.y, length.out=nrow(m)) 

for (x in seq_along(coord.x)) 
    { 
    for (y in seq_along(coord.y)) 
    { 
    if (is.na(m[x,y])) 
     grid.rect(coord.x[x], coord.y[y], just=c("left", "bottom"), 
        width, height, gp = gpar(fill = "green"))  
    } 
    } 

Daha iyi bir çözüm Eğer yoksa ...

1

edit işlevini kullanarak pheatmap kodunu kesmek ve istediğiniz gibi o ilgi UA ile uğraşmak zorunda olacaktır gplots yerine heatmap.2 kullanarak, uygun bir na.color argümanı var.m Yukarıdaki örnek verilerini alarak:

library(gplots) 
heatmap.2(m, Rowv = F, Colv = F, trace = "none", na.color = "Green") 
2

Sen github gelen pheatmap geliştirici sürümünü kullanarak bir renk atama etkinleştirebilirsiniz. Bunu kullanarak DevTools'un yapabilirsiniz:

#this part loads the dev pheatmap package from github 
if (!require("devtools")) { 
    install.packages("devtools", dependencies = TRUE) 
    library(devtools) 
} 
install_github("raivokolde/pheatmap") 

Şimdi pheatmap fonksiyonunda parametre "na_col" kullanabilirsiniz:

pheatmap(..., na_col = "grey", ...) 

(edit) unutma

sonradan yüklemek için. Kurulduktan sonra, diğer yüklü paketler gibi davranabilirsiniz.

0

Eğer NA'ların gri olmasını istiyorsanız, "NA" yı çift olarak zorlayabilirsiniz.

m[is.na(m)] <- as.double("NA") 
pheatmap(m, cluster_rows=F, cluster_cols=F)