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

