在arrangeGrob中使用 pheatmap

10

我尝试使用arrangeGrob()将两个图表放在同一个.jpg文件中。我刚开始学习网格和grobs,我认为我知道问题所在:pheatmap是一个网格对象,包含grob对象,不允许我将其放在arrangeGrob中。这是真的吗?

我是否需要将qplot放入网格中,将pheatmap放入网格中,然后将这些网格放入新的网格中?

library(grid)
library(gridExtra)
library(pheatmap)
library(ggplot2)
hmdat=rbind(c(1,2,3),
            c(3,4,5),
            c(5,6,7))
hm=pheatmap(hmdat)
qp=qplot(1,1)
lm=rbind(c(1,2,2),
         c(1,2,2))
jpeg("plots.jpg")
arrangeGrob(qp,hm, layout_matrix=lm)
dev.off()

当使用时,上述代码片段可以正常运行。

arrangeGrob(qp,qp, layout_matrix=lm)

2
尝试使用arrangeGrob(qp, hm[[4]], layout_matrix=lm)pheatmap()的手册页面在“Values”部分明确说明它返回一个组件的list,但未提及第四个组件,即图表的gtable。您必须具体索引它,因为它不会触发函数调用内对象的R print方法查找/执行。 - hrbrmstr
太棒了,谢谢!你有什么建议吗?我应该怎样在未来遇到这种问题时自己找到解决方案呢?或者说,list value 4 是 gtable 的一种特殊情况吗?还是只是需要某种方式知道这个信息?如果你把你的解决方案作为答案输入,我会将问题标记为已解决。 - Xizam
1个回答

8

我不确定你是想要六个数字还是想要两个数字,其中一个比另一个宽两倍(我尝试尽可能少的改动代码):

library("grid")
library("gridExtra")
library("pheatmap")
library("ggplot2")

hmdat=rbind(c(1,2,3),
            c(3,4,5),
            c(5,6,7))

hm <- pheatmap::pheatmap(hmdat)
qp <- qplot(1,1)

lm <- rbind(c(1,2,2),
         c(1,2,2))
grid.arrange(grobs = list(qp,hm[[4]]), layout_matrix = lm)

这将会给你以下结果: 在网格中组合pheatmap和ggplot

同样的方法,您可以将多个pheatmap并排显示:

library("grid")
library("gridExtra")
library("pheatmap")

hmdat <- rbind(c(1,2,3),
            c(3,4,5),
            c(5,6,7))

hm <- pheatmap::pheatmap(hmdat)

lm <- rbind(c(1,2),
         c(3,3))
grid.arrange(grobs = list(hm[[4]],
                          hm[[4]],
                          hm[[4]]),
             layout_matrix = lm)

pheatmap绘图网格

如@hrbrmstr在评论中提到的那样,您应该使用pheatmap对象中的第4项。还需记得将grobs作为列表提供给grid.arrange


出现错误:此S4类不可子集化 - Hirak Sarkar
@hirak-sarkar 我刚试了一下,使用 R version 4.1.0、 pheatmap_1.0.12gridExtra_2.3,运行正常。同时我也检查了 str(hm)is.list(hm),确认该对象确实为 S3 类型。不知道您是从哪里看到 S4 的类型的!请再次检查您的版本和对象。 - Mehrad Mahmoudian
好的,我明白了,在我的会话中有两个pheatmap,pheatmap::pheatmap是正确的。还有另一个来自ComplexHeatmap - Hirak Sarkar

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