如何调整rect_border使其支持smooth_rainbow等多色配色方案?
解决fviz_dend中rect_border无法使用自定义颜色向量的问题
问题描述
使用factoextra::fviz_dend绘制树状图时,rect_border参数指定预定义配色名(如"lancet")可正常运行,但传入khroma包生成的smooth rainbow颜色向量时,会触发报错:Error in if (color == "cluster") color <- "default": the condition has length > 1。需要调整代码使矩形边框能使用smooth rainbow配色。
解决方案
问题根源在于fviz_dend的rect_border参数仅支持单个颜色值或预定义配色名称,无法直接接收颜色向量。我们可以通过先完成基础绘图,再手动修改图层数据的方式绕过这个限制:
- 先生成目标配色的颜色向量,统一复用;
- 基础绘图时
k_colors正常使用该向量,rect_border先设为临时颜色; - 最后定位到矩形边框所在的图层,替换为目标配色向量。
完整修正代码
library(factoextra) library(ggplot2) library(khroma) # 数据预处理 df <- scale(mtcars) dist <- dist(df, method = "euclidean") hc <- hclust(dist, method = "ward.D2") # 生成smooth rainbow配色的4种颜色(对应4个聚类组) smooth_rainbow_cols <- khroma::colour("smooth rainbow")(n = 4) # 基础绘制树状图,rect_border先设为临时颜色 p2 <- fviz_dend(hc, k = 4, cex = 0.6, k_colors = smooth_rainbow_cols, color_labels_by_k = TRUE, rect = TRUE, rect_border = "black", # 临时边框色,后续会替换 rect_fill = TRUE, rotate = TRUE) + theme_dark() # 调整标签颜色和角度(保留原代码的自定义操作) p2$layers[[1]]$data$col[p2$layers[[1]]$data$col == "black"] <- "white" p2$layers[[2]]$data$angle <- 0 # 修改矩形边框颜色:定位到geom_rect对应的图层(此处为第3层),为每个聚类组分配对应颜色 p2$layers[[3]]$data$colour <- smooth_rainbow_cols # 查看最终绘图结果 p2
说明
运行上述代码后,树状图的聚类标签、矩形填充色(由k_colors控制)以及矩形边框色都会统一使用smooth rainbow配色,同时避免了原代码的报错逻辑。
内容的提问来源于stack exchange,提问作者MaskofIllusion
相关产品推荐
相关产品推荐

