求助:ComplexHeatmap无法复现k-means行聚类顺序问题
解决ComplexHeatmap复用k-means行聚类顺序的问题
核心问题分析
ComplexHeatmap的kmeans_rows参数仅返回聚类分组标签,不会直接输出热图最终的行排序索引——热图里的行顺序是先按聚类分组,再在组内默认执行层次聚类。如果只把聚类标签传给第二个热图,组内的行顺序会因重新聚类而改变,导致整体行顺序无法复现。
具体解决步骤
- 提取第一个热图的完整行排序索引
生成第一个热图后,通过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)
- 在第二个热图中禁用行聚类并手动指定顺序
对第二个矩阵生成热图时,必须关闭默认的行聚类(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)
- 验证行名一致性
若两个矩阵行名不匹配,手动指定的行顺序会失效。可通过以下代码检查:
all(rownames(mat1) == rownames(mat2))
若返回FALSE,需先统一两个矩阵的行名,比如重新设置行名或按行名对齐矩阵。
- 保留分组同时复用行顺序(可选)
如果需要第二个热图保留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
相关产品推荐
相关产品推荐

