2013-05-13 58 views
1

我使用gplots heatmap.2使熱圖:變量和情節保存heatmap.2再次

library(gplots) 
# some fake data 
m = matrix(c(0,1,2,3), nrow=2, ncol=2) 
# make heatmap 
hm = heatmap.2(m) 

當我做「heatmap.2」直接我得到一個陰謀,我可以輸出到設備。我怎樣才能從我的變量'hm'重新繪製情節?顯然,這是一個玩具的例子,在現實生活中,我有一個函數可以生成並返回一個我想稍後繪製的熱圖。

回答

4

有幾種選擇,雖然他們都沒有特別優雅。這取決於您的函數使用的變量是否可用於繪圖環境。 heatmap.2不會返回適當的「熱圖」對象,儘管它包含再次繪製圖形所需的信息。請參閱str(hm)檢查對象。

如果變量是在您的環境中使用,你可以只是重新評估原有的繪圖電話:

library(gplots) 
# some fake data (adjusted a bit) 
set.seed(1) 
m = matrix(rnorm(100), nrow=10, ncol=10) 
# make heatmap 
hm = heatmap.2(m, col=rainbow(4)) 

# Below fails if all variables are not available in the global environment 
eval(hm$call) 

我認爲這不會是這樣,雖然,因爲你提到你所呼叫的從函數內部繪製命令,我認爲你沒有使用任何全局變量。您可以重新構建您的hm對象中可用字段的熱圖繪製調用。問題是原始矩陣不可用,但是我們重新組織了$地毯-字段。它需要一些修補以獲得原始矩陣,作爲投影一直:

# hm2$carpet = t(m[hm2$rowInd, hm2$colInd]) 

至少在當數據矩陣尚未被縮放的情況下,下面應工作。根據您的特定繪圖調用添加額外的參數。

func <- function(mat){ 
    h <- heatmap.2(mat, col=rainbow(4)) 
    h 
} 

# eval(hm2$call) does not work, 'mat' is not available 
hm2 <- func(m) 

# here hm2$carpet = t(m[hm2$rowInd, hm2$colInd]) 
# Finding the projection back can be a bit cumbersome: 
revRowInd <- match(c(1:length(hm2$rowInd)), hm2$rowInd) 
revColInd <- match(c(1:length(hm2$colInd)), hm2$colInd) 
heatmap.2(t(hm2$carpet)[revRowInd, revColInd], Rowv=hm2$rowDendrogram, Colv=hm2$colDendrogram, col=hm2$col) 

此外,我想你也許可以用自己的方式工作,在功能的環境評估HM $呼叫。或許-功能將是有用的。

你也可以將可通過它連接到全球環境,但我認爲這被認爲是不好的做法,因爲太急於使用附加可能會導致問題。請注意,在我的示例中,每次調用func都會創建原始圖。

+0

謝謝,這是全面的;)在我的情況下,'heatmap.2(t(hm2 $地毯))'效果很好。我真的不明白'revRowInd'和'revColInd'的意思。當我在我的功能和後來只是'heatmap.2(t(hm2 $地毯))'繪製它看起來是一樣的。 – 2013-05-14 11:23:19

+0

好吧,很棒:)在我的人造的例子中,如果我沒有「逆向工程」行/列,它不會產生相同的結果,因此您應該確保它將您的情況推廣到您製作的每個情節。也許你有對稱矩陣或其他參數(例如沒有行/列重新排序)否定它。 – 2013-05-14 11:28:44

+0

謝謝,現在我得到你所做的。我會檢查是否需要它;) – 2013-05-14 11:54:29

2

我會做一些函數式編程:

create_heatmap <- function(...) { 
    plot_heatmap <- function() heatmap.2(...) 
} 

data = matrix(rnorm(100), nrow = 10) 

show_heatmap <- create_heatmap(x = data) 

show_heatmap() 

通過所有的你需要發送通過...到plot_heatmap的參數。外部函數調用設置內部函數首先查找其參數的環境。內部函數作爲一個對象返回,現在是完全可移植的。這應該每次都會產生完全相同的情節!

+0

真棒!直接實施它... – drmariod 2017-02-09 14:26:57