如何按行名顺序上下/并排展示多组同结构heatmap(无dendogram)
我来帮你搞定这个热图排版的问题!针对你的需求,我整理了两种常用R包的解决方案,都是亲测有效的:
方案一:用pheatmap快速实现(适合新手)
pheatmap是做热图的常用工具,搭配gridExtra就能轻松实现多图排列,完全满足你的需求:
步骤1:准备并对齐数据
首先确保所有数据集的行名严格按固定顺序排列,如果原始数据行序乱了,先手动调整:
# 构造示例数据(你可以替换成自己的数据集) set.seed(123) # 固定行名顺序 fixed_row_names <- paste0("Gene_", 1:10) col_names <- paste0("Sample_", 1:5) # 生成两组结构一致的数据 data1 <- matrix(rnorm(50), nrow=10, dimnames=list(fixed_row_names, col_names)) data2 <- matrix(rnorm(50, mean=1), nrow=10, dimnames=list(fixed_row_names, col_names)) # 如果你的数据行序不对,用下面的代码调整 # data_your <- data_your[fixed_row_names, ]
步骤2:生成无树状图的热图
设置参数去除树状图和分类线,同时统一标题样式:
library(pheatmap) library(gridExtra) # 生成第一个热图:关闭行/列聚类(去除树状图+分类线),设置标题 p1 <- pheatmap( data1, main = "数据集1", # 对应每组数据的标题,要统一标题就都改成同一个 cluster_rows = FALSE, # 关闭行树状图 cluster_cols = FALSE, # 关闭列树状图 border_color = NA, # 可选:去除单元格边框,让图更干净 show_rownames = TRUE, show_colnames = TRUE ) # 生成第二个热图(参数完全一致,保证样式统一) p2 <- pheatmap( data2, main = "数据集2", cluster_rows = FALSE, cluster_cols = FALSE, border_color = NA, show_rownames = TRUE, show_colnames = TRUE )
步骤3:排版并导出PDF
用grid.arrange实现并排或上下排列,然后导出到PDF:
# 并排展示 pdf("heatmaps_side_by_side.pdf", width=12, height=6) grid.arrange(p1$gtable, p2$gtable, ncol=2) dev.off() # 上下排列 pdf("heatmaps_top_bottom.pdf", width=8, height=12) grid.arrange(p1$gtable, p2$gtable, nrow=2) dev.off()
方案二:用ComplexHeatmap实现(更灵活的排版)
如果需要更复杂的布局(比如多组图、合并图例等),ComplexHeatmap是更好的选择,它的排版能力更强:
步骤1:准备数据(和上面一致)
同样先确保行名顺序固定,这里不再重复代码。
步骤2:定义热图对象
设置参数去除树状图,统一标题样式:
library(ComplexHeatmap) # 第一个热图:关闭聚类,设置标题 ht1 <- Heatmap( data1, name = "表达量", # 图例名称 column_title = "数据集1", # 顶部标题 cluster_rows = FALSE, cluster_columns = FALSE, show_row_dend = FALSE, # 显式关闭行树状图 show_column_dend = FALSE, # 显式关闭列树状图 row_names_side = "left" # 行名显示在左侧 ) # 第二个热图(参数统一) ht2 <- Heatmap( data2, name = "表达量", column_title = "数据集2", cluster_rows = FALSE, cluster_columns = FALSE, show_row_dend = FALSE, show_column_dend = FALSE, row_names_side = "left" )
步骤3:排版并导出
支持多种排列方式,还能合并图例让图更简洁:
# 并排展示(合并图例) pdf("complex_heatmaps_side.pdf", width=12, height=7) draw(ht1 + ht2, merge_legend = TRUE) dev.off() # 上下排列(合并图例) pdf("complex_heatmaps_stack.pdf", width=8, height=12) draw(ht1 %v% ht2, merge_legend = TRUE) dev.off()
关键注意事项
- 一定要保证所有数据集的行名顺序完全一致,否则热图的行排列会混乱,这是核心前提!
- 去除树状图和分类线的核心就是关闭行/列聚类(
cluster_rows = FALSE、cluster_cols = FALSE),因为分类线是基于聚类结果生成的,关闭聚类后自然就没有分类线了。 - 如果要给所有热图设置完全相同的标题,只需要把每个热图的
main(pheatmap)或column_title(ComplexHeatmap)改成同一个字符串即可。
内容的提问来源于stack exchange,提问作者nik
相关产品推荐
相关产品推荐

