有幾種選擇,雖然他們都沒有特別優雅。這取決於您的函數使用的變量是否可用於繪圖環境。 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都會創建原始圖。
謝謝,這是全面的;)在我的情況下,'heatmap.2(t(hm2 $地毯))'效果很好。我真的不明白'revRowInd'和'revColInd'的意思。當我在我的功能和後來只是'heatmap.2(t(hm2 $地毯))'繪製它看起來是一樣的。 – 2013-05-14 11:23:19
好吧,很棒:)在我的人造的例子中,如果我沒有「逆向工程」行/列,它不會產生相同的結果,因此您應該確保它將您的情況推廣到您製作的每個情節。也許你有對稱矩陣或其他參數(例如沒有行/列重新排序)否定它。 – 2013-05-14 11:28:44
謝謝,現在我得到你所做的。我會檢查是否需要它;) – 2013-05-14 11:54:29