ggdendrogram标签问题:dict<-names(treeList)无效的原因及修复方法
问题原因分析
你的代码中替换标签无效的核心原因是向量索引的逻辑错误:
dict <- names(treeList)得到的是字符向量c("A", "B", "C", "D"),这个向量的元素本身没有自定义名称,默认的位置索引是数字(1、2、3、4),但不是字符形式的键。hc$labels$label中的初始值是字符串形式的数字(比如"1"、"2"),当你用dict[[as.character(x)]]时,是在尝试从向量中查找名称等于该字符串的元素,但dict里根本没有以"1"、"2"为名称的元素,所以返回的是NULL,自然无法完成替换。
修复方案
这里提供三种可行的修复方式,按简洁程度排序:
方式一:生成hclust时直接指定标签(最推荐)
在调用hclust的时候直接传入labels参数,一步到位设置好标签,省去后续替换步骤:
library(IncDTW) library(ggplot2) library(ggdendro) A <- matrix(1:50, nrow = 50, ncol = 1) B <- matrix(1:100, nrow = 75, ncol = 1) C <- matrix(25:49, nrow = 25, ncol = 1) D <- matrix(1:50, nrow = 50, ncol = 1) treeList <- list(A,B,C,D) names(treeList) <- c("A", "B", "C", "D") # 简化名称赋值,无需逐个设置 result <- dtw_dismat(treeList, dist_method = "norm2", return_matrix = F) distMatrixResult <- result$dismat # 生成hclust时直接指定labels参数 hc <- hclust(distMatrixResult, method = "average", labels = names(treeList)) hc <- dendro_data(hc) ggdendrogram(hc)
方式二:修改dict为带键的列表
把dict转换成以数字字符串为键的列表,这样就能通过x的值匹配到对应的标签:
dict <- setNames(names(treeList), as.character(1:length(treeList))) hc$labels$label <- sapply(hc$labels$label, function(x) dict[[x]])
方式三:用位置索引取值
将hc$labels$label中的字符串数字转换成整数,直接按位置从dict中取对应元素:
dict <- names(treeList) hc$labels$label <- sapply(hc$labels$label, function(x) dict[as.integer(x)])
内容的提问来源于stack exchange,提问作者hs100
相关产品推荐
相关产品推荐

