如何使用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
相关产品推荐
相关产品推荐

