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

如何使用pheatmap对分组基因表达热图实现组内列聚类?

实现pheatmap组内聚类而不跨组打乱顺序

嘿,这个需求我太熟悉了!pheatmap本身确实没有直接的参数支持仅组内列聚类,但我们可以通过手动计算各组的聚类结果,再指定列顺序的方式来实现。核心思路就是:先对每个组的样本单独做聚类,把各组的聚类后顺序拼接起来,最后让pheatmap按照这个自定义顺序来排列列,同时关闭全局的列聚类。

下面是具体的操作步骤和代码示例:

步骤1:准备数据(假设你已经有了)

首先确保你的表达矩阵列已经按组别排好序,同时有对应的分组信息。这里我先模拟一组数据方便演示:

set.seed(123) # 固定随机种子保证结果可复现
# 模拟10个基因、12个样本的表达矩阵,4组每组3个样本
expr_mat <- matrix(rnorm(10*12), nrow=10)
colnames(expr_mat) <- paste0("Sample_", 1:12)
# 分组向量(已按组排序,和列顺序对应)
group <- rep(c("Group1", "Group2", "Group3", "Group4"), each=3)

步骤2:计算每组内的聚类顺序

我们需要拆分每个组的样本,单独计算它们的聚类结果:

library(pheatmap)

# 按分组拆分所有列名,得到每个组对应的样本集合
group_sample_sets <- split(colnames(expr_mat), group)

# 遍历每个组,计算组内样本的聚类顺序
group_cluster_orders <- lapply(group_sample_sets, function(samples) {
  # 提取当前组的子表达矩阵
  sub_matrix <- expr_mat[, samples, drop=FALSE]
  # 计算样本间的距离(默认欧氏距离,可根据需求调整,比如用相关性距离:as.dist(1-cor(t(sub_matrix))))
  sample_dist <- dist(t(sub_matrix))
  # 做层次聚类
  cluster_tree <- hclust(sample_dist)
  # 返回该组聚类后的样本顺序
  cluster_tree$labels[cluster_tree$order]
})

# 把各组的聚类顺序拼接成最终的列顺序
final_col_order <- unlist(group_cluster_orders)

步骤3:绘制热图

最后调用pheatmap时,关闭全局列聚类,指定我们自定义的列顺序即可:

pheatmap(expr_mat,
         cluster_cols = FALSE,  # 关闭全局列聚类
         col_order = final_col_order,  # 使用我们计算的组内聚类顺序
         annotation_col = data.frame(Group = group, row.names = colnames(expr_mat)), # 可选:添加分组注释栏,更直观
         show_colnames = TRUE,
         main = "Gene Expression Heatmap with Intra-group Clustering")

额外说明

  • 如果需要调整聚类的距离或方法,可以修改dist()和hclust()的参数,比如把距离换成皮尔逊相关性距离,聚类方法换成ward.D2:
    sample_dist <- as.dist(1 - cor(t(sub_matrix))) # 相关性距离
    cluster_tree <- hclust(sample_dist, method = "ward.D2") # ward聚类
    
  • 这种方法不仅能保证组内样本按聚类排序,还能完全保留你预先设置的组间顺序,不会出现跨组聚类打乱分组的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:23:19