You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按行名顺序上下/并排展示多组同结构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:52:24