R 在变量中保存热图.2并再次绘图

R 在变量中保存热图.2并再次绘图,r,heatmap,gplots,R,Heatmap,Gplots,我使用gplots中的热图.2制作热图: library(gplots) # some fake data m = matrix(c(0,1,2,3), nrow=2, ncol=2) # make heatmap hm = heatmap.2(m) 当我直接做“热图2”时,我得到了一个可以输出到设备上的图。如何从变量“hm”重新绘制绘图?很明显,这是一个玩具示例,在现实生活中,我有一个函数,可以生成并返回一个热图,稍后我将绘制该热图。有几种选择,尽管它们都不是特别优雅。这取决于函数使用的变量

我使用gplots中的热图.2制作热图:

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

当我直接做“热图2”时,我得到了一个可以输出到设备上的图。如何从变量“hm”重新绘制绘图?很明显,这是一个玩具示例,在现实生活中,我有一个函数,可以生成并返回一个热图,稍后我将绘制该热图。

有几种选择,尽管它们都不是特别优雅。这取决于函数使用的变量是否在打印环境中可用。heatmap.2不会返回正确的heatmap对象,尽管它包含重新绘制图形所需的信息。请参阅strhm以检查对象

如果变量在您的环境中可用,则只需重新计算原始打印调用:

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)
我假设情况并非如此,正如您提到的,您是从函数内部调用plot命令的,并且我认为您没有使用任何全局变量。您可以从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$调用。也许使用函数将是有用的


您也可以通过将mat附加到全球环境来提供mat,但我认为这被认为是一种不好的做法,因为过于急切地使用attach可能会导致问题。请注意,在我的示例中,对func的每次调用都会创建原始绘图。

有几个备选方案,尽管没有一个特别优雅。这取决于函数使用的变量是否在打印环境中可用。heatmap.2不会返回正确的heatmap对象,尽管它包含重新绘制图形所需的信息。请参阅strhm以检查对象

如果变量在您的环境中可用,则只需重新计算原始打印调用:

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)
我假设情况并非如此,正如您提到的,您是从函数内部调用plot命令的,并且我认为您没有使用任何全局变量。您可以从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$调用。也许使用函数将是有用的


您也可以通过将mat附加到全球环境来提供mat,但我认为这被认为是一种不好的做法,因为过于急切地使用attach可能会导致问题。请注意,在我的示例中,对func的每次调用都会创建原始绘图。

我会进行一些函数编程:

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

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

show_heatmap <- create_heatmap(x = data)

show_heatmap()

将需要发送到plot_heatmap的所有参数通过…传递。。。。外部函数调用设置了一个环境,其中内部函数首先查找其参数。内部函数作为对象返回,现在是完全可移植的。每次都应该产生完全相同的图

我会做一些函数式编程:

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

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

show_heatmap <- create_heatmap(x = data)

show_heatmap()

将需要发送到plot_heatmap的所有参数通过…传递。。。。外部函数调用设置了一个环境,其中内部函数首先查找其参数。内部函数作为对象返回,现在是完全可移植的。每次都应该产生完全相同的图

谢谢,这是全面的;在我的例子中,“热图.2平方米地毯”效果很好。我真的不明白“revRowInd”和“revColInd”是什么意思。当我在我的函数中绘图时,然后使用“heatmap.2thm2$地毯”,它看起来是一样的。好吧,很好:在我的人工示例中,如果我没有对行/列进行反向工程,它不会产生相同的结果,所以你应该确保它在你的情况下推广到你正在绘制的每个绘图。也许你有一个对称矩阵或一些其他参数,例如,没有行/列重新排序会否定它。谢谢,现在我明白你所做的了。我会检查我是否需要它;谢谢,这是全面的;在我的例子中,“热图.2平方米地毯”效果很好。我真的不明白“revRowInd”和“revColInd”是什么意思。当我在我的函数中绘图时,后来只使用“heatmap.2thm2$地毯”,它看起来是一样的。好吧,太好了:在我的人工示例中,如果我不反转engi,它不会产生相同的结果
不要使用行/列,因此您应该确保它在您的情况下适用于您正在绘制的每个绘图。也许你有一个对称矩阵或一些其他参数,例如,没有行/列重新排序会否定它。谢谢,现在我明白你所做的了。我会检查我是否需要它;