【问题标题】:Combining pheatmaps in R在 R 中组合 pheatmaps
【发布时间】:2018-08-01 09:09:48
【问题描述】:

我一直在努力解决如何将 2 个或多个热图(热图)组合到最终绘图中,但没有成功。

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 个 pheatmap 组成,因此它们必须排列成 4 列和 4 行。

我尝试了par mfrow,但没有成功。

如何合并 pheatmap?

我知道有很多 R 包可以绘制热图,但我想用 pheatmap 来做这件事

【问题讨论】:

  • 这是因为pheatmap 似乎正在使用grid 图形。所有par 命令仅适用于基础绘图。 gridExtra::grid.arrange(hm_data1, hm_data2) 应该可以解决问题。
  • @Axeman 我收到此错误:only 'grobs' allowed in "gList"

标签: r combinations heatmap pheatmap


【解决方案1】:

这会起作用。

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)

基于其中一个 cmets。如果您有许多单幅地块;你可以使用这样的循环。

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 个 pheatmap (4x4) 的代码?
  • 请查看所做的更改。
  • 我要绘制两个 pheatmap。但是,当尝试绘制更多地图时,对我来说似乎更棘手。我怎么能画出大约 16 个地块?我的意思是,我在使用 [[4]] 时迷路了。我尝试了 16 而不是 4,在a[[]] 之后创建了 16 个带有连续数字的新行,但没有结果。有什么帮助吗?
  • 是的,您应该将要绘制的数据放在一个列表中(在您的情况下是一个包​​含 16 个矩阵的列表)。然后做一个简单的for循环;每次应用 pheatmap 函数并将输出添加到新列表(在我的示例中为 a)。您不能更改“[[4]]”,因为这只是说明稍后绘制需要 pheatmap 输出的哪一部分。
  • 我已将此代码添加到答案中。你能检查一下这有什么用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2021-05-15
  • 1970-01-01
  • 2020-01-04
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多