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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:13:19