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

R语言Sankey图颜色异常求助:指定颜色未生效

Sankey图颜色异常问题排查与修复

问题描述

使用networkD3绘制Sankey图时出现两个异常:

  • 代码中指定为黄色(Yellow)的"No Change"节点实际显示为橙色(#eb6841)
  • 左侧分类节点的颜色与对应连线颜色不匹配

问题根源

  1. 节点分组未明确指定:调用sankeyNetwork时设置了LinkGroup但未定义NodeGroup参数,节点会自动继承其关联连线的分组值匹配颜色比例尺,而非使用节点名称,导致节点颜色被错误覆盖。
  2. 颜色比例尺逻辑混乱:将节点名称和连线分组混合放在同一个颜色比例尺的domain中,极易出现顺序对应错误,进一步加剧颜色匹配问题。

修复方案

核心调整点

  • 为节点添加独立的分组字段,明确区分普通分类节点和结果节点的分组
  • 通过NodeGroup参数指定节点使用自身分组匹配颜色,避免继承连线分组
  • 简化颜色比例尺的domain,让分组与颜色的对应关系更清晰

修正后的完整代码

library(networkD3)

# 创建节点数据,新增分组字段
nodes = data.frame(
  name = c("Demographics", "Inequality", "Productivity", "Urbanisation",
           "Balance of Payments", "Consumption", "Debt", "FDI",
           "Trade Deals", "Currency", "Positive", "No Change", "Negative"),
  group = c("group_1", "group_1", "group_2", "group_2", 
            "group_3", "group_3", "group_4", "group_4", 
            "group_5", "group_5", "positive", "no_change", "negative")
)

# 创建边数据
links = as.data.frame(matrix(c(0, 12, 2,
                               1, 11, 2,
                               2, 10, 2,
                               3, 10, 2,
                               4, 11, 2,
                               5, 10, 2,
                               6, 12, 2,
                               7, 11, 2,
                               8, 10, 2,
                               9, 11, 2), byrow = TRUE, ncol = 3))
names(links) = c("source", "target", "value")

# 为边设置分组,与对应左侧节点分组一致
links$group <- c("group_1", "group_1", "group_2", "group_2",
                 "group_3", "group_3", "group_4", "group_4",
                 "group_5", "group_5")

# 定义颜色比例尺,清晰对应所有分组
node_color <- 'd3.scaleOrdinal()
  .domain(["group_1", "group_2", "group_3", "group_4", "group_5",
           "positive", "no_change", "negative"])
  .range(["#edc951", "#eb6841", "#cc2a36", "#4f372d", "#00a0b0",
          "Green", "Yellow", "Red"])'

# 绘制Sankey图,指定NodeGroup参数
p = sankeyNetwork(Links = links, Nodes = nodes,
                  Source = "source", Target = "target",
                  Value = "value", NodeID = "name",
                  NodeGroup = "group", # 关键:指定节点使用自身分组匹配颜色
                  fontSize = 14, nodeWidth = 40,
                  colourScale = node_color,
                  LinkGroup = "group")

p

修复效果说明

  • 明确指定NodeGroup后,节点不再继承连线分组,"No Change"节点会正确匹配黄色(Yellow)
  • 左侧分类节点的分组与对应连线分组一致,保证节点和连线颜色完全匹配
  • 颜色比例尺的domain和range一一对应,逻辑清晰,避免了混合节点名和分组导致的匹配错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:25:48