繁体   English   中英

将heatmap.2保存到变量中,然后再次绘图

[英]Save heatmap.2 in variable and plot again

我使用来自gplots的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”再次绘制图? 显然,这是一个玩具示例,在现实生活中,我有一个函数可以生成并返回一个热图,稍后我将对其进行绘制。

有几种选择,尽管它们都不是特别优雅。 这取决于您的函数使用的变量在绘图环境中是否可用。 heatmap.2不会返回适当的“ heatmap ”对象,尽管它包含用于再次绘制图形的必要信息。 请参阅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)

我认为情况并非如此,因为您提到要从函数内部调用plot命令,并且我认为您没有使用任何全局变量。 您可以从hm -object中可用的字段重新构建热图绘制调用。 问题是原始矩阵不可用,但是我们有一个重新组织的$ carpet -field。 它需要一些修补才能获得原始矩阵,因为投影一直是:

# 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 $ call的方式。 也许带有功能会很有用。

你也可以将可通过其连接到全球环境的垫子 ,但我认为这被认为是不好的做法,因为太急于使用连接可能会导致问题。 请注意,在我的示例中,每次对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。 外部函数调用建立了一个环境,其中内部函数首先查找其参数。 内部函数作为对象返回,现在可以完全移植。 每次都应该产生完全相同的情节!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM