Why does my d3 force-directed graph not display edges?

本小妞迷上赌 提交于 2019-12-22 05:24:21

问题


I created a simple force-directed graph using d3: http://goo.gl/afHTD

Why are the edges of the graph not showing? Here is my entire HTML file. You could also see it and tinker with it by going to view source on my linked page of course. It is based on the example from the d3 website.

<!DOCTYPE html>
<html>
  <head>
    <title>Force-Directed Layout</title>
    <script type="text/javascript" src="d3.v2.js"></script>
    <style type="text/css">

div.node {
  border-radius: 6px;
  width: 12px;
  height: 12px;
  margin: -6px 0 0 -6px;
  position: absolute;
}

div.link {
  position: absolute;
  border-bottom: solid #999 1px;
  height: 0;
  -webkit-transform-origin: 0 0;
  -moz-transform-origin: 0 0;
  -ms-transform-origin: 0 0;
  -o-transform-origin: 0 0;
  transform-origin: 0 0;
}

    </style>
  </head>
  <body>
  <div id="chart"></div>
    <script type="text/javascript">

var width = 960,
    height = 500;

var color = d3.scale.category20();

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

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

d3.json("newJson.json", function(json) {
  force
      .nodes(json.nodes)
      .links(json.links)
      .start();

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

  var node = svg.selectAll("circle.node")
      .data(json.nodes)
    .enter().append("circle")
      .attr("class", "node")
      .attr("r", 5)
      .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; });
  });
});

    </script>
  </body>
</html>

Shouldn't var link... display the edges? My JSON file is also pretty simple:

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

回答1:


You need to apply a stroke style via CSS. Your current node and link styles are restricted to HTML DIV elements, while the nodes and links are actually represented as SVG circle and line elements, respectively. Try this:

.node {
  fill: #000;
  stroke: #fff;
  stroke-width: 1.5px;
}

.link {
  stroke: #aaa;
  stroke-width: 1.5px;
}


来源:https://stackoverflow.com/questions/10080660/why-does-my-d3-force-directed-graph-not-display-edges

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!