Force based label Placement

HTML

<script src="https://d3js.org/d3.v2.js"></script>
<body>

</body>

JavaScript

// http://bl.ocks.org/MoritzStefaner/1377729

var w = 960,
  h = 500;

var labelDistance = 0;

var vis = d3.select("body").append("svg:svg").attr("width", w).attr("height", h);

var nodes = [];
var labelAnchors = [];
var labelAnchorLinks = [];
var links = [];

for (var i = 0; i < 30; i++) {
  var node = {
    label: "node " + i
  };
  nodes.push(node);
  labelAnchors.push({
    node: node
  });
  labelAnchors.push({
    node: node
  });
};

for (var i = 0; i < nodes.length; i++) {
  for (var j = 0; j < i; j++) {
    if (Math.random() > .95)
      links.push({
        source: i,
        target: j,
        weight: Math.random()
      });
  }
  labelAnchorLinks.push({
    source: i * 2,
    target: i * 2 + 1,
    weight: 1
  });
};

var force = d3.layout.force().size([w, h]).nodes(nodes).links(links).gravity(1).linkDistance(50).charge(-3000).linkStrength(function(x) {
  return x.weight * 10
});


force.start();

var force2 = d3.layout.force().nodes(labelAnchors).links(labelAnchorLinks).gravity(0).linkDistance(0).linkStrength(8).charge(-100).size([w, h]);
force2.start();

var link = vis.selectAll("line.link").data(links).enter().append("svg:line").attr("class", "link").style("stroke", "#CCC");

var node = vis.selectAll("g.node").data(force.nodes()).enter().append("svg:g").attr("class", "node");
node.append("svg:circle").attr("r", 5).style("fill", "#555").style("stroke", "#FFF").style("stroke-width", 3);
node.call(force.drag);


var anchorLink = vis.selectAll("line.anchorLink").data(labelAnchorLinks).enter().append("svg:line").attr("class", "anchorLink").style("stroke", "#f00");

var anchorNode = vis.selectAll("g.anchorNode").data(force2.nodes()).enter().append("svg:g").attr("class", "anchorNode");
//anchorNode.append("svg:circle").attr("r", 2).style("fill", "#F00");
anchorNode.append("svg:text").text(function(d, i) {
  return i % 2 == 0 ? "" : d.node.label
}).style("fill", "#555").style("font-family", "Arial").style("font-size", 12);

var updateLink = function() {
 ...