2017-06-02 229 views
3

我想繪製熱圖。
我有100k * 100k方陣(50Gb(csv),右上角數字和其他0填充)。用「超大」矩陣繪製熱圖

我想問:「我怎樣才能用R繪製熱圖?」與這個巨大的數據集。
我想在大型RAM機器上的這段代碼。

d = read.table("data.csv", sep=",") 
d = as.matrix(d + t(d)) 
heatmap(d) 

我嘗試了一些庫,如heatmap.2(在gplots中)或其他。
但他們需要這麼多時間和記憶。

+0

對不起但100K X 100K磚的熱圖是完全不可能想象在屏幕上,即使工作圖像將被大幅縮小,你會看到一個插值像素,應該有50x50的瓷磚......所以,爲什麼不縮放矩陣然後調用熱圖? – digEmAll

+0

是不是應該像10:1的行和列進行降採樣並繪製?在這種情況下,集羣看起來像平等嗎? – kgyk1993

+0

是的,這就是我的意思...或者你可以分開你的矩陣說100個子矩陣,並繪製他們每個... – digEmAll

回答

9

我建議你在繪製熱圖之前嚴格縮減你的矩陣,例如,做每個子矩陣的平均值(由@IaroslavDomin的建議):

# example of big mx 10k x 10 k 
bigMx <- matrix(rnorm(10000*10000,mean=0,sd=100),10000,10000) 

# here we downsample the big matrix 10k x 10k to 100x100 
# by averaging each submatrix 
downSampledMx <- matrix(NA,100,100) 
subMxSide <- nrow(bigMx)/nrow(downSampledMx) 
for(i in 1:nrow(downSampledMx)){ 
    rowIdxs <- ((subMxSide*(i-1)):(subMxSide*i-1))+1 
    for(j in 1:ncol(downSampledMx)){ 
    colIdxs <- ((subMxSide*(j-1)):(subMxSide*j-1))+1 
    downSampledMx[i,j] <- mean(bigMx[rowIdxs,colIdxs]) 
    } 
} 

# NA to disable the dendrograms 
heatmap(downSampledMx,Rowv=NA,Colv=NA) 

enter image description here

爲了確保您的龐大矩陣,將需要一段時間來計算downSampledMx,但它應該是可行的。


編輯:

我覺得應該降採樣保持可識別 「宏觀模式」,例如請看下面的例子:

# create a matrix with some recognizable pattern 
set.seed(123) 
bigMx <- matrix(rnorm(50*50,mean=0,sd=100),50,50) 
diag(bigMx) <- max(bigMx) # set maximum value on the diagonal 
# set maximum value on a circle centered on the middle 
for(i in 1:nrow(bigMx)){ 
    for(j in 1:ncol(bigMx)){ 
    if(abs((i - 25)^2 + (j - 25)^2 - 10^2) <= 16) 
     bigMx[i,j] <- max(bigMx) 
    } 
} 

# plot the original heatmap 
heatmap(bigMx,Rowv=NA,Colv=NA, main="original") 


# function used to down sample 
downSample <- function(m,newSize){ 
    downSampledMx <- matrix(NA,newSize,newSize) 
    subMxSide <- nrow(m)/nrow(downSampledMx) 
    for(i in 1:nrow(downSampledMx)){ 
    rowIdxs <- ((subMxSide*(i-1)):(subMxSide*i-1))+1 
    for(j in 1:ncol(downSampledMx)){ 
     colIdxs <- ((subMxSide*(j-1)):(subMxSide*j-1))+1 
     downSampledMx[i,j] <- mean(m[rowIdxs,colIdxs]) 
    } 
    } 
    return(downSampledMx) 
} 

# downsample x 2 and plot heatmap 
downSampledMx <- downSample(bigMx,25) 
heatmap(downSampledMx,Rowv=NA,Colv=NA, main="downsample x 2") 

# downsample x 5 and plot heatmap 
downSampledMx <- downSample(bigMx,10) 
heatmap(downSampledMx,Rowv=NA,Colv=NA, main="downsample x 5") 

這裏的3個熱圖:

enter image description here enter image description here enter image description here

+0

謝謝@digEmAll !!我清楚地明白了。順便說一下,您認爲縮減採樣矩陣顯示的是與原始矩陣相同的屬性嗎?我擔心矩陣的屬性會因下采樣而改變(這就是爲什麼我試圖用原始矩陣繪製)。 – kgyk1993

+0

檢查我的編輯;) – digEmAll

+0

謝謝你的禮貌評論。當我不需要聚類時,我認爲你所說的是正確的,但是如果你需要在縮減採樣之後進行聚類,它是否相似? – kgyk1993