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

如何手动为sunburst()旭日图着色:子节点与父节点同色系渐变

实现sunburst旭日图同色系深浅渐变的方法

完全可以实现这个需求,核心是手动构建颜色映射表,让每个子节点继承父节点的色系,同时按层级从内到外逐步浅化色调,最后将映射表传入sunburstR的colors参数即可。以下是具体步骤和代码示例:

1. 准备符合格式的数据

sunburstR需要带路径(层级用分隔符连接)和数值的数据集,先构造示例数据:

library(sunburstR)
library(dplyr)
library(colorspace) # 用于颜色浅化处理

# 示例分类数据
taxa_data <- data.frame(
  Taxa = rep(c("Cetacea", "Carnivora"), each = 4),
  Family = c("Balaenopteridae", "Balaenopteridae", "Delphinidae", "Delphinidae", 
             "Felidae", "Felidae", "Canidae", "Canidae"),
  Genus = c("Balaenoptera", "Megaptera", "Tursiops", "Delphinus",
            "Panthera", "Felis", "Canis", "Vulpes"),
  Value = c(10, 8, 12, 9, 7, 6, 11, 5)
)

# 转换为sunburst要求的路径格式(用"-"分隔层级)
taxa_paths <- taxa_data %>%
  mutate(path = paste(Taxa, Family, Genus, sep = "-")) %>%
  select(path, Value)

2. 构建同色系渐变的颜色映射表

先给顶层(内圈)Taxa分配基础色,然后逐层给子节点生成浅化后的同色系颜色:

# 顶层Taxa的基础色
base_colors <- c("Cetacea" = "#2c3e50", "Carnivora" = "#e74c3c")
color_map <- base_colors

# 处理Family层级:基于父Taxa颜色浅化20%
family_nodes <- unique(taxa_data$Family)
for(fam in family_nodes) {
  parent_taxa <- unique(taxa_data$Taxa[taxa_data$Family == fam])
  parent_color <- base_colors[parent_taxa]
  # 浅化颜色,amount参数控制浅化程度(0-1)
  color_map[fam] <- lighten(parent_color, amount = 0.2)
}

# 处理Genus层级:基于父Family颜色再浅化20%
genus_nodes <- unique(taxa_data$Genus)
for(gen in genus_nodes) {
  parent_fam <- unique(taxa_data$Family[taxa_data$Genus == gen])
  parent_color <- color_map[parent_fam]
  color_map[gen] <- lighten(parent_color, amount = 0.2)
}

如果你的层级更多,可以用通用循环自动遍历处理:

# 自动处理多层级的通用逻辑示例
levels <- c("Taxa", "Family", "Genus") # 按从内到外的层级顺序
for(i in 2:length(levels)) {
  current_level <- levels[i]
  parent_level <- levels[i-1]
  current_nodes <- unique(taxa_data[[current_level]])
  
  for(node in current_nodes) {
    parent_node <- unique(taxa_data[[parent_level]][taxa_data[[current_level]] == node])
    parent_color <- color_map[parent_node]
    color_map[node] <- lighten(parent_color, amount = 0.2)
  }
}

3. 绘制带渐变颜色的旭日图

将颜色映射表传入sunburst()函数的colors参数:

sunburst(taxa_paths, colors = color_map)

补充说明

  • 若不想依赖colorspace包,也可以手动解析RGB值实现浅化:把十六进制颜色转为RGB,每个通道数值增加固定值(如+30,注意不超过255),再转回十六进制即可。
  • 调整lighten()函数的amount参数可以控制渐变深浅幅度,数值越大颜色越浅。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:28:40