如何合并不同尺寸的ComplexHeatmap图?含报错排查与PDF导出方案
问题:合并不同尺寸ComplexHeatmap并导出PDF时出现报错
我有20个不同尺寸的ComplexHeatmap图需要合并到同一绘图中,尝试了以下代码:
h1 <- grid.grabExpr(draw(Heatmap(as.matrix(df_1[2:1692]), col = rev(rainbow(10)), name = "C1", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C"))) h2 <- grid.grabExpr(draw(Heatmap(as.matrix(df_2[2:2269]), col = rev(rainbow(10)), name = "C2", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C", use_raster = FALSE))) h3 <- draw(Heatmap(as.matrix(df_3[2:1384]), col = rev(rainbow(10)), name = "C3", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C")) plot_grid(h1, plot_grid(h2, h3))
运行后出现错误:
Error in UseMethod("depth") :
no applicable method for 'depth' applied to an object of class "NULL"
我猜测是否没有直接合并不同尺寸ComplexHeatmap图的方法?请问将这些图合并后导出为PDF的最佳方案是什么?
解决方案
报错原因
你的代码中h3未使用grid.grabExpr()抓取,直接保留了draw()返回的Heatmap对象,与h1、h2的grob对象类型不匹配,导致plot_grid无法处理,触发报错。另外ComplexHeatmap基于grid绘图系统,直接混用ggplot2生态的plot_grid容易出现兼容性问题。
合并不同尺寸ComplexHeatmap的可行方案
方案1:使用grid包原生布局(推荐)
先将所有Heatmap转换为grob对象,再用grid.layout自定义布局组合:
library(grid) library(ComplexHeatmap) # 1. 批量生成所有20个图的grob对象 h_list <- list( grid.grabExpr(draw(Heatmap(as.matrix(df_1[2:1692]), col = rev(rainbow(10)), name = "C1", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C"))), grid.grabExpr(draw(Heatmap(as.matrix(df_2[2:2269]), col = rev(rainbow(10)), name = "C2", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C", use_raster = FALSE))), grid.grabExpr(draw(Heatmap(as.matrix(df_3[2:1384]), col = rev(rainbow(10)), name = "C3", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C"))) # 依次添加剩余17个图的grabExpr代码 ) # 2. 定义布局:示例为4行5列,可按需调整行列数 layout <- grid.layout(nrow = 4, ncol = 5) # 3. 组合并绘制所有图 grid.newpage() pushViewport(viewport(layout = layout)) for (i in seq_along(h_list)) { row_pos <- (i - 1) %/% 5 + 1 col_pos <- (i - 1) %% 5 + 1 pushViewport(viewport(layout.pos.row = row_pos, layout.pos.col = col_pos)) grid.draw(h_list[[i]]) popViewport() } popViewport()
方案2:修正类型后使用cowplot的plot_grid
确保所有图均为grob对象,统一传入plot_grid指定行列布局:
library(cowplot) library(ComplexHeatmap) library(grid) # 生成所有20个图的grob对象 h1 <- grid.grabExpr(draw(Heatmap(as.matrix(df_1[2:1692]), col = rev(rainbow(10)), name = "C1", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C"))) h2 <- grid.grabExpr(draw(Heatmap(as.matrix(df_2[2:2269]), col = rev(rainbow(10)), name = "C2", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C", use_raster = FALSE))) h3 <- grid.grabExpr(draw(Heatmap(as.matrix(df_3[2:1384]), col = rev(rainbow(10)), name = "C3", cluster_columns = TRUE, cluster_rows = FALSE, show_column_names = FALSE, show_column_dend = FALSE, row_title = "G", column_title = "C"))) # 继续创建h4到h20... # 合并为4行5列的组合图 combined_plot <- plot_grid(h1, h2, h3, h4, ..., h20, nrow = 4, ncol = 5) print(combined_plot)
导出为PDF的最佳方式
方式1:适配grid原生布局的导出
pdf("combined_heatmaps.pdf", width = 20, height = 15) # 按需调整宽高 grid.newpage() pushViewport(viewport(layout = layout)) for (i in seq_along(h_list)) { row_pos <- (i - 1) %/% 5 + 1 col_pos <- (i - 1) %% 5 + 1 pushViewport(viewport(layout.pos.row = row_pos, layout.pos.col = col_pos)) grid.draw(h_list[[i]]) popViewport() } popViewport() dev.off()
方式2:适配cowplot组合图的导出
save_plot("combined_heatmaps.pdf", combined_plot, base_width = 20, base_height = 15)
注意:宽高参数需根据20个图的实际尺寸调整,避免图被截断或显示不全。
内容的提问来源于stack exchange,提问作者Echo94
相关产品推荐
相关产品推荐

