如何在R的pheatmap中提取聚类相关性值并添加欧氏距离图例?
在R中实现pheatmap的聚类距离提取与图例添加,及替代方案
一、提取列聚类的相关性数值
pheatmap本身不会直接返回聚类所用的相关性矩阵,但你可以手动计算对应的值——因为clustering_distance_cols = "correlation"本质是用1 - Pearson相关系数作为距离度量,直接计算列间的Pearson相关矩阵即可得到所需数值:
# 加载包并构造示例数据 library(pheatmap) set.seed(123) data <- matrix(rnorm(100), nrow = 10) # 计算列间Pearson相关矩阵(对应pheatmap的correlation距离) col_cor_matrix <- cor(t(data)) # 转置数据让原列变为行,cor函数默认按行计算相关 # 打印相关性数值 cat("列聚类所用的相关性数值:\n") print(col_cor_matrix) # 正常绘制热图 p <- pheatmap(data, clustering_distance_cols = "correlation", clustering_distance_rows = "euclidean")
二、为行聚类的欧氏距离添加图例
pheatmap没有内置的距离图例参数,但可以借助grid包手动在热图上添加。核心思路是先计算行的欧氏距离范围,再用grid绘图工具添加颜色渐变图例:
library(grid) # 计算行的欧氏距离矩阵并获取范围 row_euclidean_dist <- dist(data, method = "euclidean") dist_min_max <- range(row_euclidean_dist) # 在热图右侧添加图例 # 图例标题 grid.text("行欧氏距离", x = 0.9, y = 0.95, gp = gpar(fontsize = 10)) # 图例边框 grid.rect(x = 0.9, y = 0.8, width = 0.02, height = 0.6, gp = gpar(fill = NA, col = "black")) # 颜色渐变条(蓝到红对应距离从小到大) grid.raster(matrix(seq(1, 0, length.out = 100), ncol = 1), x = 0.9, y = 0.8, width = 0.02, height = 0.6) # 添加刻度标签 grid.text(round(dist_min_max[1], 2), x = 0.92, y = 0.5, gp = gpar(fontsize = 8)) grid.text(round(dist_min_max[2], 2), x = 0.92, y = 0.8, gp = gpar(fontsize = 8))
三、更易用的替代R包
如果觉得pheatmap的操作太繁琐,推荐以下两个功能更全面的包:
1. ComplexHeatmap
这是目前功能最强大的热图绘制包,支持直接获取聚类相关的距离矩阵,且自定义图例非常便捷:
library(ComplexHeatmap) library(circlize) # 计算列相关矩阵和行欧氏距离 col_cor_matrix <- cor(t(data)) row_euclidean_dist <- dist(data, method = "euclidean") dist_min_max <- range(row_euclidean_dist) # 自定义颜色映射 dist_col_fun <- colorRamp2(dist_min_max, c("blue", "red")) # 绘制热图并添加行距离图例 ht <- Heatmap(data, clustering_distance_columns = function(x) as.dist(1 - cor(t(x))), # 对应correlation距离 clustering_distance_rows = row_euclidean_dist, heatmap_legend_param = list(title = "数据值"), # 添加行欧氏距离的独立图例 annotation_legend_list = list( Legend(title = "行欧氏距离", col_fun = dist_col_fun, at = seq(dist_min_max[1], dist_min_max[2], length.out = 5), labels = round(seq(dist_min_max[1], dist_min_max[2], length.out = 5), 2)) )) draw(ht) # 打印列相关性数值 cat("列聚类所用的相关性数值:\n") print(col_cor_matrix)
2. heatmap.2(gplots包)
经典的热图工具,支持直接配置距离相关的图例,虽然灵活性略逊于ComplexHeatmap,但上手简单:
library(gplots) # 计算列相关距离和行欧氏距离 col_dist <- as.dist(1 - cor(t(data))) row_dist <- dist(data, method = "euclidean") # 绘制热图并添加距离图例 heatmap.2(data, distfun = function(x) row_dist, # 行距离用欧氏 hclustfun = function(x) hclust(x, method = "complete"), Colv = as.dendrogram(hclust(col_dist)), # 列聚类用correlation距离 key = TRUE, keysize = 1.5, main = "热图(行欧氏距离,列相关性聚类)")
内容的提问来源于stack exchange,提问作者Denise
相关产品推荐
相关产品推荐

