在d3js Force Layout中向节点添加箭头和文本

时间:2015-12-21 14:30:38

标签: javascript html d3.js

我一直在尝试将文字和箭头添加到d3js力布局图中,但无法获得所需的结果。

我的脚本如下所示:

var width = 600;
height = 400;

var color = d3.scale.category20();

var force = d3.layout.force()
    .charge(-120)
    .linkDistance(100)
    .size([width, height]);

var svg = d3.select("#t").append("svg")
    .attr("width", width)
    .attr("height", height);

d3.json("topology.json", function(error, graph) {
  if (error) throw error;

  force
      .nodes(graph.nodes)
      .links(graph.links)
      .start();

  var link = svg.selectAll(".link")
      .data(graph.links)
      .enter().append("line")
      .attr("class", "link")
      .style("stroke-width", function(d) { return 2*(d.value); });//Math.sqrt

  var node = svg.selectAll(".node")
      .data(graph.nodes)
      .enter().append("circle")
      .attr("class", "node")
      .attr("r", 10)
      .style("fill", function(d) { return color(d.group); })
      .call(force.drag);
  node.append("title")
      .text(function(d) { return d.name; });  

  force.on("tick", function() {
    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; });
  });
});

我尝试添加以下代码段来添加文字

  node.append("text")
  .attr("x", 12)
  .attr("dy", ".35em")
  .text(function(d) { return d.name; });  

示例json数据是

{
    "nodes": [{
        "name": "0",
        "group": 2
    }, {
        "name": "1",
        "group": 2
    }, {
        "name": "2",
        "group": 2
    }, {
        "name": "3",
        "group": 1
    }],
    "links": [{
        "source": 0,
        "target": 1,
        "value": 1
    }, {
        "source": 1,
        "target": 3,
        "value": 2
    }, {
        "source": 2,
        "target": 3,
        "value": 1
    }]
}

任何有关向圈子和箭头添加文字的帮助都会很棒。对不起,如果我听到一个菜鸟。

谢谢:) :))

1 个答案:

答案 0 :(得分:0)

Mobashyr,我使用以下示例来满足我的要求:

when($"tc" === "a" && $"amt" >= 0, "N")
 .when($"tc" isin ("a", "b"), "Y")