1

我在使用 csv 文件填充 sankey 图时遇到 CORS 问题,因此我想用嵌入式 json 替换它以进行测试。我已重新格式化 csv 数据以将其转换为 d3 sankey 插件所需的格式,但我无法弄清楚如何让 javascript 读取 json 输入来代替 csv。

我用来加载 csv 的代码如下:

/ load the data with d3.csv
d3.csv("testinput.csv", function(error, data) {

	graph = {"nodes" : [], "links" : []};

  data.forEach(function (d, i) {
    var item = { source: d.source, target: d.target, values: [] };
    for (var j=0; j < 101; j++) {
      item.values.push(d['value'+j.toString()]);
    }
    portfolioValues.push(item);
    graph.nodes.push({ "name": d.source });
    graph.nodes.push({ "name": d.target });
    graph.links.push({
        source: portfolioValues[i].source,
        target: portfolioValues[i].target,
        value: portfolioValues[i].values[startingAllocation]
    });
  });

  //this handy little function returns only the distinct / unique nodes
  graph.nodes = d3.keys(d3.nest()
           .key(function (d) { return d.name; })
           .map(graph.nodes));

  //it appears d3 with force layout wants a numeric source and target
  //so loop through each link replacing the text with its index from node
  graph.links.forEach(function (d, i) {
      graph.links[i].source = graph.nodes.indexOf(graph.links[i].source);
      graph.links[i].target = graph.nodes.indexOf(graph.links[i].target);
      portfolioValues[i].source = graph.links[i].source;
      portfolioValues[i].target = graph.links[i].target;
  });

  //now loop through each nodes to make nodes an array of objects rather than an array of strings
  graph.nodes.forEach(function (d, i) {
      graph.nodes[i] = { "name": d };
  });

我想使用的json是:

{
"nodes": [
{"node":1,"name":"AA"},
{"node":2,"name":"BB"},
{"node":3,"name":"XX"},
{"node":4,"name":"YY"}
],
"links": [
{"target":3,"source":1,"value":300},
{"target":4,"source":2,"value":0},
{"target":3,"source":2,"value":0},
{"target":4,"source":2,"value":200}
]}

4

1 回答 1

0

是 a 的 jsfiddle Sankey diagram

在此处输入图像描述

json 完全嵌入在 javascript 中,并封装在一个函数 getData() 中。

于 2015-02-08T22:15:11.673 回答