2011-12-04 65 views
6

我使用R从一个矩阵使用热图创建一个热图.2 - 我想将这些图像分组成一个大的图像 - 我通常用来实现这个是layout() - 但这不起作用,因为heatmap.2使用布局,显然布局不能递归地工作。布局内部布局在R

有没有人有任何建议如何组合2张图像没有布局,或如何使布局支持递归调用?

mat = matrix(nrow=3,nrow=3,1:9) 
layout(matrix(nrow=2,ncol=1)) 
heatmap.2(mat) ## overrides the layout and produces only one plot that takes whole screen 
heatmap.2(mat) ## still only one image 

谢谢。

回答

6

接下来的内容几乎肯定不是一个完美的解决方案,但它可能会让你开始。

创建您自己的heatmap.2函数,调用hm3。在hm3代码中注释掉所有的线路:

if (missing(lhei) || is.null(lhei)) 

layout电话:

layout(lmat, widths = lwid, heights = lhei, respect = FALSE) 

它的代码一大块,也许是30日线。现在,下面的代码通过侧产生与树状图和按键侧两个热图:

x <- as.matrix(mtcars) 
lhei <- c(1.5, 4,1.5,4) 
lwid <- c(1.5, 4,1.5,4) 
layout(rbind(c(4,3,8,7),c(2,1,6,5)), 
    widths = lwid, heights = lhei, respect = FALSE) 
hm3(x) 
hm3(x) 

enter image description here

显然,这将需要相当大的调整,以使它看起来不错(和更大的绘图区域,我已经压缩一切是一个合理的大小在这里发布)。

这完全没有经过测试。使用控制图的外观的hm3函数中的任何选项很可能会导致事情稍微有些过时。但这可能是您自己尝试解决这些问题的一个很好的起点。

+0

谢谢 - 太糟糕了,没有更简单的方法来做到这一点......我会留下更多的问题,以防有人知道更通用的解决方案,但看起来生活很艰难,您的解决方案是最好的,(尽管我可能只是解决我的问题,而不是玩热图代码听起来不好玩)。 – dan12345

1

你打算如何处理结果?

如果您只是想在屏幕上并排比较2张热贴图,而不是将它们合并成一张图,则可以打开2张绘图设备并排列它们进行比较(比创建单张图要简单得多) :

heatmap.2(mat1) 
dev.new() 
heatmap.2(mat2) 

现在使用鼠标将其中一个拉到另一侧。

如果您希望将组合图形包含在出版物中,那么可能最容易创建2个图并将它们并排设置在您用来创建文章的任何程序中。如果你在一个文件中需要它们,你仍然可以将2个热图(或其他图)保存为2个文件,然后使用imagemagick,gimp或inkscape等工具将两个文件并排放入1中。