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

如何调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:32:46