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

