在R中合并热力图

3

我一直在尝试解决如何将两个或更多的热图(heatmap)合并成一个最终的图表,但没有成功。

data1 <- structure(list(DC1 = c(NA, NA, 1.98), DC2 = c(NA, NA, 0.14), 
    DC3 = c(1.85, 1.51, 0.52), DC4 = c(0.89, 0.7, 1.47), DC5 = c(0, 
    0.78, 0), DC6 = c(0, 1.3, 0), DC7 = c(0, 1.47, 0), DC8 = c(0, 
    1.2, 0), DC9 = c(0, 0, 0), DC10 = c(0.51, 1.9, 0)), .Names = c("DC1", 
    "DC2", "DC3", "DC4", "DC5", "DC6", "DC7", "DC8", "DC9", "DC10"), 
    enter code here`class = "data.frame", row.names = c("A", "B",  "C"))

data 2 <- structure(list(DC1 = c(9.56, 1.87, 2.07, 1.87, 2.07, 1.35), DC2 = c(5.51, 1.13, 1.25, 1.13, 0.99, 0.45), DC3 = c(4.84, 1.17, 0.66, 1.17, 
0.34, 0.16), DC4 = c(4.18, 0.59, 0.05, 0.97, 0.43, 0.59), DC5 = c(3.26, 
0, 0.14, 0.31, 0.79, 0.63), DC6 = c(3.35, 0, 1.12, 0.05, 1.12, 
0), DC7 = c(4.18, 0.63, 1.27, 0.47, 1.27, 0), DC8 = c(4.37, 1.17, 
1.3, 1.17, 0, 0), DC9 = c(4.3, 1.13, 0, 1.13, 0, 0), DC10 = c(7.47, 
1.88, 0.71, 1.88, 0, 0)), .Names = c("DC1", "DC2", "DC3", "DC4", 
"DC5", "DC6", "DC7", "DC8", "DC9", "DC10"), class = "data.frame", row.names = c("TD6 vs SH", 
"TD6 vs SAP", "TD6 vs NEA", "SH vs SAP", "SH vs NEA", "SAP vs NEA"
))

我可以通过以下两行代码轻松地使用pheatmap构建热图:

hm_data1 <- pheatmap(as.matrix(data1))
hm_data2 <- pheatmap(as.matrix(data2))

然而,我无法在一个图中同时打印两个图像。我想看到它们水平放置。但是,我的真正图形将由16个热度图组成,所以它们必须排列为4列和4行。
我尝试了使用par mfrow,但没有成功。
如何组合pheatmap?
我知道有很多可以绘制热度图的R包,但我想用pheatmap来做。

这是因为 pheatmap 似乎正在使用 grid 图形。所有的 par 命令只适用于基本绘图。gridExtra::grid.arrange(hm_data1, hm_data2) 应该能解决问题。 - Axeman
2
@Axeman 我遇到了这个错误:只允许在"gList"中使用'grobs' - antecessor
1个回答

5

这将起作用。

library(gridExtra); library(pheatmap)

m <- matrix(c(1:4), ncol=2)
n <- matrix(c(1,1,1,2), ncol=2)
a <- list(pheatmap(m)[[4]])
a[[2]] <- pheatmap(n)[[4]]
z <- do.call(grid.arrange,a)
plot(z)

根据一条评论。如果您有许多单独的图形,则可以使用如下循环。

mn <- list(m, n)

a <- list()
for(i in 1:length(mn)){
  a[i] <- list(pheatmap(mn[[i]])[[4]])
}

z <- do.call(grid.arrange,a)
plot(z)

重点是将您单个图的所有数据添加到列表中。然后,您可以循环遍历该列表,应用pheatmap


谢谢您的评论。我不想生成PDF,我想在RStudio中绘制它。否则,16个热图(4x4)的代码是什么? - antecessor
请查看所做的更改。 - milan
是的,您应该将要绘制的数据放在一个列表中(在您的情况下是一个包含16个矩阵的单个列表)。然后进行简单的for循环;每次应用pheatmap函数并将输出添加到新列表中(在我的示例中为'a')。您不能更改'[[4]]',因为它只是指定稍后绘图所需的pheatmap输出的哪个部分。 - milan
好的。我尝试使用以下代码,但没有成功:a <- list(mapa_calor(overlap_ALL_ODS_UI1), mapa_calor(overlap_ALL_ODS_LC), mapa_calor(overlap_ALL_ODS_LP3), mapa_calor(overlap_ALL_ODS_LM1), mapa_calor(overlap_ALL_ODS_LM3))for(map in a) { z <- do.call(grid.arrange, map) plot(z) } - antecessor
1
我已经将这段代码添加到答案中。您能否检查一下它是否有效? - milan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接