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

D3.js v3中如何用对象/动态数据替换d3.json的URL参数

问题:D3.v3中如何用本地数据替代d3.json加载的外部JSON文件?

我是D3.js新手,正在制作桑基图(sankey diagram)。找到一个使用外部.json文件的示例,该示例基于d3.v3版本。我知道这个版本较旧,但因现有树形图也使用该版本,所以希望只加载一个D3版本。目前桑基图运行正常,但我想将静态JSON文件替换为从数据库获取的动态数据:加载页面后查询数据库,获取数据并格式化为对象数组,再将该数组传入桑基图代码。

我先做了小改动,将JSON文件内容复制到页面中:

var MYDATA = {
"links": [
{"source":"Agricultural Energy Use","target":"Carbon Dioxide","value":"1.4"},
{"source":"Agriculture","target":"Agriculture Soils","value":"5.2"},
{"source":"Agriculture","target":"Livestock and Manure","value":"5.4"},
{"source":"Agriculture","target":"Other Agriculture","value":"1.7"},
...
};

原本加载文件的相关桑基图代码为:

d3.json("#APP_FILES#sankeygreenhouse.json", function(error, graph) {
    var nodeMap = {};
    graph.nodes.forEach(function(x) { nodeMap[x.name] = x; });
    graph.links = graph.links.map(function(x) {
      return {
        source: nodeMap[x.source],
        target: nodeMap[x.target],
        value: x.value
      };
    });
    // 后续桑基图渲染代码
});

我尝试将其改为使用MYDATA而非#APP_FILES#sankeygreenhouse.json,修改后的代码行如下:

d3.json(MYDATA, function(error, graph) {

但这会导致404错误,请问如何解决该问题?


解决方案

出现404是因为d3.json()的第一个参数要求是URL字符串,你传入本地对象MYDATA时,它会把这个对象强制转为字符串去请求对应的资源地址,自然找不到资源报错。

1. 使用本地已定义的MYDATA数据

直接跳过d3.json的异步请求逻辑,把MYDATA当作graph数据直接处理:

// 直接使用本地定义的MYDATA
var graph = MYDATA;
var nodeMap = {};
graph.nodes.forEach(function(x) { nodeMap[x.name] = x; });
graph.links = graph.links.map(function(x) {
  return {
    source: nodeMap[x.source],
    target: nodeMap[x.target],
    value: x.value
  };
});
// 继续执行后续的桑基图渲染代码...

2. 从数据库动态获取数据

如果需要从后端数据库获取数据,用d3.json请求后端提供数据的接口URL即可:

// 替换为你的后端接口地址
d3.json("/api/your-sankey-data-endpoint", function(error, graph) {
  if (error) throw error; // 处理请求错误
  // 同样执行节点映射和链接转换逻辑
  var nodeMap = {};
  graph.nodes.forEach(function(x) { nodeMap[x.name] = x; });
  graph.links = graph.links.map(function(x) {
    return {
      source: nodeMap[x.source],
      target: nodeMap[x.target],
      value: x.value
    };
  });
  // 后续桑基图渲染代码...
});

3. 手动组装动态数据

如果是通过其他方式(比如表单交互、其他接口返回)组装好符合格式的数据对象,同样直接把该对象当作graph来处理,不需要调用d3.json。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:28:21