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

求助:ComplexHeatmap无法复现k-means行聚类顺序问题

解决ComplexHeatmap复用k-means行聚类顺序的问题

核心问题分析

ComplexHeatmap的kmeans_rows参数仅返回聚类分组标签,不会直接输出热图最终的行排序索引——热图里的行顺序是先按聚类分组,再在组内默认执行层次聚类。如果只把聚类标签传给第二个热图,组内的行顺序会因重新聚类而改变,导致整体行顺序无法复现。

具体解决步骤

  1. 提取第一个热图的完整行排序索引
    生成第一个热图后,通过Heatmap对象的row_order属性获取热图实际显示的行排列顺序,这才是需要复用的核心信息,而非单纯的k-means聚类标签。
    示例代码:
library(ComplexHeatmap)

# 生成第一个矩阵与热图
mat1 <- matrix(rnorm(100), nrow = 10)
rownames(mat1) <- paste0("row", 1:10)
ht1 <- Heatmap(mat1, kmeans_rows = 3)
draw(ht1)

# 提取第一个热图的行顺序
row_order <- row_order(ht1)
  1. 在第二个热图中禁用行聚类并手动指定顺序
    对第二个矩阵生成热图时,必须关闭默认的行聚类(cluster_rows = FALSE),再通过row_order参数传入第一步提取的行顺序。同时要确保两个矩阵的行名完全一致,否则索引匹配会失效。
    示例代码:
# 生成第二个矩阵(行名需与mat1完全一致)
mat2 <- matrix(rnorm(100), nrow = 10)
rownames(mat2) <- rownames(mat1)

# 复用行顺序生成第二个热图
ht2 <- Heatmap(mat2, cluster_rows = FALSE, row_order = row_order)
draw(ht2)
  1. 验证行名一致性
    若两个矩阵行名不匹配,手动指定的行顺序会失效。可通过以下代码检查:
all(rownames(mat1) == rownames(mat2))

若返回FALSE,需先统一两个矩阵的行名,比如重新设置行名或按行名对齐矩阵。

  1. 保留分组同时复用行顺序(可选)
    如果需要第二个热图保留k-means分组结构,同时组内行顺序与第一个热图一致,可提取聚类标签后结合split参数使用:
# 提取第一个热图的k-means聚类标签
kmeans_labels <- row_split(ht1)

# 生成带分组且复用行顺序的热图
ht2 <- Heatmap(mat2, cluster_rows = FALSE, row_order = row_order, split = kmeans_labels)
draw(ht2)

常见误区

  • 仅传递k-means聚类标签(row_split)而不指定row_order:组内会重新执行层次聚类,导致行顺序变化。
  • 未关闭cluster_rows = FALSE:默认的行聚类会覆盖手动指定的顺序。

内容的提问来源于stack exchange,提问作者Minky J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:17:33