【问题标题】:to display two heatmaps in same pdf side by side in R在R中并排显示相同pdf中的两个热图
【发布时间】:2013-02-27 14:18:34
【问题描述】:

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

【问题讨论】:

  • par(mfrow=c(2,1)) x

标签: r pdf png heatmap


【解决方案1】:

这是使用最近引入的 gridGraphics 包的一个选项,

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)

【讨论】:

  • 只是一个更新:这个函数也适用于heatmap.2。改编自上面的代码,我简单的加载了library(gplots),把heatmap(as.matrix(mtcars))改成了heatmap.2(as.matrix(mtcars))
  • 很好的解决方案,谢谢!但是为什么渲染每个热图需要这么长时间呢??
【解决方案2】:

如 heatmap.2 的帮助文档中所述,

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

热图也是如此。

【讨论】:

    【解决方案3】:

    这是一种方法。这很 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)
    

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

    【讨论】:

      【解决方案4】:

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

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

      2) 但是,这需要做很多工作,我想坚持使用基本的 heatmap() 函数。如果您安装了 imagemagick,以下内容很简单(虽然不是普通的 R)并且可以在 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')
      

      【讨论】:

        猜你喜欢
        • 2019-09-03
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        相关资源
        最近更新 更多