2016-08-02 85 views
0

我想从我的JSON链接数据中设置参数为value的节点半径。节点和链路具有以下格式D3 JS强制布局:使用链接参数设置节点半径

"nodes": {"name": "Flare", "group": 1}, 
"links": {"source": 0, "target": 1, "value": 10} 

它工作正常使用d.group参数,像这样设置节点半径:

nodes.append("circle") 
    .attr("class", "node") 
    .attr("r", function (d) { return d.group}) 

虽然使用链接d.value有类似的想法行不通:

nodes.append("circle") 
    .attr("class", "node") 
    .attr("r", function (d) { return d.value }) 

如何从链接中提取数据?

+0

这是因为,链接是为线和节点的循环。所以,链接数据不会绑定到节点数据。打印d检查它包含的内容 –

+0

好的,谢谢,我明白了。我为节点属性调用'd',它显示节点数据,然后在'linkDistance'内调用'd',并返回链接数据。那么,下一个问题是,有没有一种方法可以用链接参数设置节点大小?我正在动态更改链接数据,并且需要更改每组链接的节点大小。 – dl00065

+0

问题是节点数量和链接不相等。我不知道你在努力达到什么目的。 –

回答

0

看看修改后的函数,我在修改节点数据以从链接添加值数据。我希望这是你正在寻找的。

var svg = d3.select("svg"), 
 
    width = +svg.attr("width"), 
 
    height = +svg.attr("height"); 
 

 
var color = d3.scaleOrdinal(d3.schemeCategory20); 
 

 
var simulation = d3.forceSimulation() 
 
    .force("link", d3.forceLink().id(function(d) { return d.id; })) 
 
    .force("charge", d3.forceManyBody()) 
 
    .force("center", d3.forceCenter(width/4, height/4)); 
 

 

 
    var graph = { 
 
    "nodes": [ 
 
    {"id": "Myriel", "group": 1}, 
 
    {"id": "Napoleon", "group": 1}, 
 
    {"id": "Mlle.Baptistine", "group": 1}, 
 
    {"id": "Mme.Magloire", "group": 1}, 
 
    {"id": "CountessdeLo", "group": 1}, 
 
    {"id": "Geborand", "group": 1}, 
 
    {"id": "Champtercier", "group": 1}, 
 
    {"id": "Cravatte", "group": 1}, 
 
    {"id": "Count", "group": 1}, 
 
    {"id": "OldMan", "group": 1} 
 
    ], 
 
    "links": [ 
 
    {"source": "Napoleon", "target": "Myriel", "value": 13}, 
 
    {"source": "Mlle.Baptistine", "target": "Myriel", "value": 8}, 
 
    {"source": "Mme.Magloire", "target": "Mlle.Baptistine", "value": 6}, 
 
    {"source": "CountessdeLo", "target": "Myriel", "value": 10}, 
 
    {"source": "Geborand", "target": "Myriel", "value": 16}, 
 
    {"source": "Champtercier", "target": "Myriel", "value": 17}, 
 
    {"source": "Cravatte", "target": "Myriel", "value": 19}, 
 
    {"source": "Count", "target": "Myriel", "value": 20}, 
 
    {"source": "OldMan", "target": "Myriel", "value": 8} 
 
    ] 
 
}; 
 
    var link = svg.append("g") 
 
     .attr("class", "links") 
 
    .selectAll("line") 
 
    .data(graph.links) 
 
    .enter().append("line") 
 
     .attr("stroke-width", function(d) { return Math.sqrt(d.value); }); 
 

 
function modified() { 
 
\t \t for(var j = 0 ; j < graph.nodes.length ; j++) { 
 
\t \t \t for(var i = 0 ; i < graph.links.length ; i++) { 
 
\t \t \t \t if(graph.nodes[j].id == graph.links[i].source) { 
 
\t \t \t \t \t graph.nodes[j].value = graph.links[i].value; 
 
\t \t \t \t \t break; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t \t return graph.nodes; 
 
} 
 
    var node = svg.append("g") 
 
     .attr("class", "nodes") 
 
    .selectAll("circle") 
 
    .data(modified()) 
 
    .enter().append("circle") 
 
     .attr("r", function (d) { 
 
\t \t if(d.value == NaN) { 
 
\t \t \t d.value = 5; 
 
\t \t } 
 
\t \t return d.value }) 
 
     .attr("fill", function(d) { return color(d.group); }) 
 
     .call(d3.drag() 
 
      .on("start", dragstarted) 
 
      .on("drag", dragged) 
 
      .on("end", dragended)); 
 

 
    node.append("title") 
 
     .text(function(d) { return d.id; }); 
 

 
    simulation 
 
     .nodes(graph.nodes) 
 
     .on("tick", ticked); 
 

 
    simulation.force("link") 
 
     .links(graph.links); 
 

 
    function ticked() { 
 
    link 
 
     .attr("x1", function(d) { return d.source.x; }) 
 
     .attr("y1", function(d) { return d.source.y; }) 
 
     .attr("x2", function(d) { return d.target.x; }) 
 
     .attr("y2", function(d) { return d.target.y; }); 
 

 
    node 
 
     .attr("cx", function(d) { return d.x; }) 
 
     .attr("cy", function(d) { return d.y; }); 
 
    } 
 

 
function dragstarted(d) { 
 
    if (!d3.event.active) simulation.alphaTarget(0.3).restart(); 
 
    d.fx = d.x; 
 
    d.fy = d.y; 
 
} 
 

 
function dragged(d) { 
 
    d.fx = d3.event.x; 
 
    d.fy = d3.event.y; 
 
} 
 

 
function dragended(d) { 
 
    if (!d3.event.active) simulation.alphaTarget(0); 
 
    d.fx = null; 
 
    d.fy = null; 
 
}
.links line { 
 
    stroke: #999; 
 
    stroke-opacity: 0.6; 
 
} 
 

 
.nodes circle { 
 
    stroke: #fff; 
 
    stroke-width: 1.5px; 
 
}
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<svg width="960" height="600"></svg>

+0

太棒了,像魅力一样工作! – dl00065

相关问题