Open eyworldwide opened 10 years ago
源码地址:https://github.com/TBEDP/datavjs/blob/master/lib/charts/force.js
Force.prototype.setSource = function (table, map) { map = this.map(map); //this.net = json; if (table[0][0] === "node") { table = table.slice(1); } var nData = []; var lData = []; var isNode = true; var nodeNum; var that = this; table.forEach(function (d, i) { var value; if (isNode) { if (d[map.nodeId] === "link") { isNode = false; nodeNum = i + 1; } else { if (d[map.nodeId] === "") { throw new Error("ID can not be empty(line:" + (i + 1) + ")."); } value = that._toNum(d[map.nodeValue]); nData[i] = { name: d[map.nodeName], nodeValue: value }; if (i === 0) { that.nodeValueMin = value; that.nodeValueMax = value; } that.nodeValueMin = (value < that.nodeValueMin) ? value : that.nodeValueMin; that.nodeValueMax = (value > that.nodeValueMax) ? value : that.nodeValueMax; } } else { if (d[map.linkSource - 3] === "") { throw new Error("Source can not be empty(line:" + (i + 1) + ")."); } if (d[map.linkTarget - 3] === "") { throw new Error("Target can not be empty(line:" + (i + 1) + ")."); } value = that._toNum(d[map.linkValue - 3]); lData[i - nodeNum] = { source: that._toNum(d[map.linkSource - 3]), target: that._toNum(d[map.linkTarget - 3]), value: that._toNum(d[map.linkValue - 3]) }; if (i === nodeNum) { that.linkValueMin = value; that.linkValueMax = value; } that.linkValueMin = (value < that.linkValueMin) ? value : that.linkValueMin; that.linkValueMax = (value > that.linkValueMax) ? value : that.linkValueMax; } }); this.net.nodes = nData; this.net.links = lData; this.nodeValueMax++; this.linkValueMax++; };
这段代码中设置link的source和target的时候,应该根据数据的id来索引
lData[i - nodeNum] = { source: that._toNum(d[map.linkSource - 3]), target: that._toNum(d[map.linkTarget - 3]), value: that._toNum(d[map.linkValue - 3]) };
fixed后的代码如下:
Force.prototype.setSource = function (table, map) { map = this.map(map); //this.net = json; if (table[0][0] === "node") { table = table.slice(1); } var nData = [], lData = [], isNode = true, nodeNum, that = this, NUM = 3, // FIXED: 用数据的id索引nodes index = {}, source = map.linkSource - NUM, target = map.linkTarget - NUM, lValue = map.linkValue - NUM; table.forEach(function (d, i) { var value; if (isNode) { if (d[map.nodeId] === "link") { isNode = false; nodeNum = i + 1; } else { if (d[map.nodeId] === "") { throw new Error("ID can not be empty(line:" + (i + 1) + ")."); } value = +(d[map.nodeValue]); nData[i] = { name: d[map.nodeName], nodeValue: value }; if (i === 0) { that.nodeValueMin = value; that.nodeValueMax = value; } that.nodeValueMin = (value < that.nodeValueMin) ? value : that.nodeValueMin; that.nodeValueMax = (value > that.nodeValueMax) ? value : that.nodeValueMax; } } else { if (d[map.linkSource - 3] === "") { throw new Error("Source can not be empty(line:" + (i + 1) + ")."); } if (d[map.linkTarget - 3] === "") { throw new Error("Target can not be empty(line:" + (i + 1) + ")."); } value = +(d[map.linkValue - 3]); // FIXED: 用数据的id索引nodes index[d[map.id]] = i; lData[i - nodeNum] = { source: +(index[d[source]]), target: +(index[d[target]]), value: +(index[d[lValue]]) }; if (i === nodeNum) { that.linkValueMin = value; that.linkValueMax = value; } that.linkValueMin = (value < that.linkValueMin) ? value : that.linkValueMin; that.linkValueMax = (value > that.linkValueMax) ? value : that.linkValueMax; } }); this.net.nodes = nData; this.net.links = lData; this.nodeValueMax++; this.linkValueMax++; };
提pull request吧
源码地址:https://github.com/TBEDP/datavjs/blob/master/lib/charts/force.js
这段代码中设置link的source和target的时候,应该根据数据的id来索引
fixed后的代码如下: