在R中并排显示相同pdf中的两个热图

时间:2013-02-27 14:18:35

标签: r pdf png heatmap

我试图在同一个png或pdf中并排显示两个或多个热图。布局或mfcol在这种情况下不起作用。有人可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:3)

如热图2的帮助文档中所述,

  

'heatmap.2()'使用'layout'并在下面绘制'image'      2x2布局的右上角。因此,它可以      用于多列/行布局,即'par(mfrow = *)'或      '(mfcol = *)'已被调用。

热图也是如此。

答案 1 :(得分:2)

这是使用最近推出的gridGraphics包

的一个选项

enter image description here

library(gridGraphics)
library(grid)
heatmap(as.matrix(mtcars))

library(gridGraphics)
grab_grob <- function(){
  grid.echo()
  grid.grab()
}

g <- grab_grob()
grid.newpage()

# library(gridExtra)
# grid.arrange(g,g, ncol=2, clip=TRUE)

lay <- grid.layout(nrow = 1, ncol=2)
pushViewport(viewport(layout = lay))
grid.draw(editGrob(g, vp=viewport(layout.pos.row = 1, 
                                  layout.pos.col = 1, clip=TRUE)))
grid.draw(editGrob(g, vp=viewport(layout.pos.row = 1, 
                                  layout.pos.col = 2, clip=TRUE)))
upViewport(1)

答案 2 :(得分:1)

这是一种方法。这是非常hacky,但我认为,当一个功能不能做你想做的事情时,最好的解决方案就是让它无论如何都能做到。 函数heatmap.2在其代码中间包含以下三行:

...
op <- par(no.readonly = TRUE)
on.exit(par(op))
layout(lmat, widths = lwid, heights = lhei, respect = FALSE)
...

正是由于它们,您无法使用layoutpar(mar=...),因为它会覆盖它。 将heatmap.2的代码复制到一个新函数(比如heatmap.3)并删除这三行:

heatmap.3 <- function(... #etc etc with the exact same code minus those 3 lines

然后你的代码将并排生成你的两个热图,例如:

layout(rbind(c(4,3,8,7),c(2,1,6,5)), 
       widths = c(1,2,1,2), heights = c(1,2), respect = FALSE)
heatmap.3(x)
heatmap.3(y)

准备布局时,请记住热图代码首先绘制热图本身,然后是“行”树形图,然后是“col”树形图,最后是直方图,因此从上到下,从左到右的顺序为4, 3,2,1意思是当两个热图并排时它变成4,3,8,7,2,1,6,5。

答案 3 :(得分:1)

在遇到完全相同的问题之后,我提出了以下解决方案:

1)使用ggplot2制作带有树形图的热图,如下所示:Reproducing lattice dendrogram graph with ggplot2然后使用multiplot()函数(http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/

进行排列

2)然而,这是很多工作,我想坚持使用基础heatmap()函数。以下是很容易的(虽然不是简单的R)并且如果安装了imagemagick,则可以在Linux上运行:

m <- matrix(runif(10^2), ncol=10)
for (i1 in 1:4) {
    ifile <- paste0(i1,'_heatmap.pdf')
    pdf(ifile)
    heatmap(m)
    d <- dev.off()
}
system('montage -geometry 100% -tile 2x2 ./*_heatmap.pdf outfile.pdf')