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

如何用ggplot的facet_grid将48种聚类树状图按方法组合矩阵排列?

实现步骤与代码

要实现按距离方法为列、聚类方法为行的矩阵式树状图排列,需要先将原生聚类树状图转换为ggplot兼容的数据格式,再通过facet_grid完成布局,具体操作如下:

1. 加载依赖包并定义方法列表

library(tidyverse)
library(ggdendro)

# 定义6种距离计算方法
d_methods <- c("euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski")
# 定义8种层次聚类方法
c_methods <- c("ward.D", "ward.D2", "single", "complete", "average", "mcquitty", "median", "centroid")

2. 编写批量生成树状图数据的函数

该函数会根据输入的距离、聚类方法,生成带分组标记的树状图线段数据,适配ggplot绘图:

get_dendro_data <- function(d_method, c_method) {
  # 计算样本间距离矩阵
  dist_mat <- dist(sakubunp, method = d_method)
  # 执行层次聚类
  hclust_obj <- hclust(dist_mat, method = c_method)
  # 将树状图转换为ggplot可用的坐标数据格式
  dendro_data <- ggdendro::dendro_data(hclust_obj, type = "rectangle")
  # 添加距离、聚类方法的标记,用于后续分面
  dendro_data$segments <- dendro_data$segments %>% 
    mutate(d_method = d_method, c_method = c_method)
  return(dendro_data$segments)
}

3. 批量生成所有方法组合的树状图数据

# 生成所有距离+聚类方法的组合
method_combinations <- expand.grid(d_method = d_methods, c_method = c_methods, stringsAsFactors = FALSE)
# 批量处理所有组合,合并为统一的数据框
all_dendro_data <- pmap_dfr(method_combinations, get_dendro_data)

4. 用ggplot + facet_grid绘制矩阵排列的树状图

ggplot(all_dendro_data, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_segment() +
  # 按聚类方法为行、距离方法为列分面排列
  facet_grid(c_method ~ d_method) +
  # 使用树状图专用主题,隐藏不必要的坐标轴元素
  theme_dendro() +
  # 调整标签大小和面板间距,提升可读性
  theme(strip.text = element_text(size = 8),
        panel.spacing = unit(0.2, "cm"))

关键说明

  • 原生hclust生成的树状图属于base绘图系统,无法直接使用facet_grid,因此借助ggdendro包将其转换为线段坐标数据,适配ggplot语法。
  • facet_grid(c_method ~ d_method)的语法规则为行变量 ~ 列变量,完全匹配需求中「聚类方法为行、距离方法为列」的排列要求。
  • 若需调整minkowski距离的参数,可在dist()函数中添加p参数(如dist(..., p = 3))自定义幂次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:42:50