升级d3-sankey至最新版本后layout方法报错如何解决?
解决d3-sankey从v0.4.2升级到最新版本的layout弃用问题
d3-sankey自v0.12版本起完全重构了API,旧版的.layout()方法已被移除,同时节点/链接的布局计算逻辑也发生了变化。你遇到的translate(undefined,undefined)错误,本质是新版本未正确配置图表尺寸,导致布局计算出的节点位置为undefined。
修正步骤:
创建并配置sankey生成器
新版本需要先定义sankey生成器,并明确指定图表的宽高(这是旧版不需要的必填项),同时根据你的数据结构配置节点ID匹配规则(如果链接用ID关联而非索引)。传入数据计算布局
调用生成器处理原始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
相关产品推荐
相关产品推荐

