我正在尝试在同一个 png 或 pdf 中并排显示两个或多个热图。布局或 mfcol 在这种情况下不起作用。有人可以帮我解决这个问题。
4 回答
这是使用最近引入的 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 的帮助文档中所述,
'heatmap.2()' 使用 'layout' 并在 2x2 布局的右下角绘制 'image'。因此,它不能在多列/行布局中使用,即,当'par(mfrow= *)' 或'(mfcol= *)' 已被调用时。
热图也是如此。
这是一种方法。这很hacky,但我认为当一个函数没有做你想做的事情时,最好的解决方案就是让它去做。
函数heatmap.2
在其代码的中间包含以下三行:
...
op <- par(no.readonly = TRUE)
on.exit(par(op))
layout(lmat, widths = lwid, heights = lhei, respect = FALSE)
...
正是因为它们,您无法使用它们,layout
并且par(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。
在遇到完全相同的问题后,我想出了以下解决方案:
1) 使用 ggplot2 用树状图制作热图,如下所示:Reproduce 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')