在R语言flipPlots桑基图中保持丝带颜色从源到终节点一致
解决桑基图路径颜色从源节点保持一致的问题
方法1:调整flipPlots参数实现
flipPlots::SankeyDiagram的link.color参数默认按当前环节的源节点分配颜色,要让整条路径颜色和初始节点(Married)保持一致,可通过分组绑定实现:
- 给数据集新增分组列,绑定初始节点
Married的取值:
my.data$group <- my.data$Married
- 修改桑基图生成代码,将
link.color设为"Group",并指定分组依据为新增的group列:
library(flipPlots) SankeyDiagram(my.data[, -4], link.color = "Group", group.by = my.data$group, weights = my.data$freq)
此时整条路径的颜色会和Married节点的类别颜色保持统一,不会在经过Pet节点后变色。
方法2:用networkD3包实现精细控制
如果需要更灵活的颜色自定义,可使用networkD3包构建桑基图,手动绑定每条路径的颜色到初始节点类别:
- 整理桑基图所需的节点与链接结构:
library(networkD3) # 生成所有节点的列表 nodes <- data.frame( name = unique(c(as.character(my.data$Married), as.character(my.data$Pet), as.character(my.data$Happy))) ) # 生成Married到Pet的链接,记录对应初始分组 links_married_pet <- data.frame( source = match(my.data$Married, nodes$name) - 1, target = match(my.data$Pet, nodes$name) - 1, value = my.data$freq, group = my.data$Married ) # 生成Pet到Happy的链接,沿用初始分组 links_pet_happy <- data.frame( source = match(my.data$Pet, nodes$name) - 1, target = match(my.data$Happy, nodes$name) - 1, value = my.data$freq, group = my.data$Married ) # 合并所有链接 all_links <- rbind(links_married_pet, links_pet_happy) # 定义初始节点的颜色映射 color_map <- 'd3.scaleOrdinal() .domain(["Yes", "No"]) .range(["#2e8b57", "#ff6347"]);'
- 绘制桑基图:
sankeyNetwork(Links = all_links, Nodes = nodes, Source = "source", Target = "target", Value = "value", NodeID = "name", LinkGroup = "group", NodeGroup = "name", colourScale = color_map, fontSize = 12, nodeWidth = 30)
这种方式能确保从Married到Pet再到Happy的整条路径颜色完全一致,与初始节点的类别绑定。
内容的提问来源于stack exchange,提问作者Aisha Ali
相关产品推荐
相关产品推荐

