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

升级d3-sankey至最新版本后layout方法报错如何解决?

解决d3-sankey从v0.4.2升级到最新版本的layout弃用问题

d3-sankey自v0.12版本起完全重构了API,旧版的.layout()方法已被移除,同时节点/链接的布局计算逻辑也发生了变化。你遇到的translate(undefined,undefined)错误,本质是新版本未正确配置图表尺寸,导致布局计算出的节点位置为undefined。

修正步骤:

  1. 创建并配置sankey生成器
    新版本需要先定义sankey生成器,并明确指定图表的宽高(这是旧版不需要的必填项),同时根据你的数据结构配置节点ID匹配规则(如果链接用ID关联而非索引)。

  2. 传入数据计算布局
    调用生成器处理原始graph数据,得到包含位置信息的nodes和links,再用这些数据绘制图形。

替换后的完整示例代码:

// 假设你已定义了svg容器、图表宽高
const width = 800;
const height = 600;
const svg = d3.select("#sankey-container").append("svg")
  .attr("width", width)
  .attr("height", height);

// 1. 配置sankey生成器
const sankeyGenerator = d3.sankey()
  .width(width)
  .height(height)
  .nodeId(d => d.id); // 如果你的节点用id标识,链接的source/target为id时需配置此项

// 2. 计算布局
const sankeyData = sankeyGenerator(graph);

// 绘制链接
svg.append("g")
  .attr("fill", "none")
  .attr("stroke", "#333")
  .attr("stroke-opacity", 0.2)
  .selectAll("path")
  .data(sankeyData.links)
  .join("path")
  .attr("d", d3.sankeyLinkHorizontal())
  .attr("stroke-width", d => Math.max(1, d.width));

// 绘制节点
svg.append("g")
  .selectAll("rect")
  .data(sankeyData.nodes)
  .join("rect")
  .attr("x", d => d.x0)
  .attr("y", d => d.y0)
  .attr("width", d => d.x1 - d.x0)
  .attr("height", d => d.y1 - d.y0)
  .attr("fill", "#69b3a2")
  .attr("stroke", "#000");

关键注意点:

  • 旧版的.layout(32)是指定布局迭代次数,新版本已自动处理,无需手动配置。
  • 确保你的graph数据结构符合新版本要求:nodes数组包含节点数据,links数组包含source/target(可以是节点索引或id,对应配置nodeId)以及value字段。
  • 绘制链接时必须使用d3.sankeyLinkHorizontal()(或垂直方向的sankeyLinkVertical())生成路径,旧版的路径生成方式已失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:52:39