title: Additional information for Collapsible Force Layout Visualization of D3
body: <p>I wish to use the <a href="http://mbostock.github.io/d3/talk/20111116/force-collapsible.html" rel="nofollow noreferrer">Collapsible Force Layout visualization</a> offered by D3. </p>
  
  <p><img src="https://i.stack.imgur.com/1a49N.png" alt="enter image description here"></p>
  
  <p>I am a novice at using D3.js and wasn't able to locate the flare.json that was being used to render the demo visualization. Is there a way to get the file?</p>
  
  <p>Also, can this graph be used to work with datasets where a node may have more than one parent? (That is, two or more nodes might have the same child node). Is there a way to edit the code to suit this requirement?</p>
  
  <p>The code being used on the sample page is as under:</p>
  
  <pre><code>&lt;!DOCTYPE html&gt;
  &lt;html&gt;
    &lt;head&gt;
      &lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8"&gt;
      &lt;link type="text/css" rel="stylesheet" href="style.css"/&gt;
      &lt;style type="text/css"&gt;
  
  circle.node {
    cursor: pointer;
    stroke: #000;
    stroke-width: .5px;
  }
  
  line.link {
    fill: none;
    stroke: #9ecae1;
    stroke-width: 1.5px;
  }
  
      &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
      &lt;h2&gt;
        Flare code size&lt;br&gt;
        force-directed graph
      &lt;/h2&gt;
      &lt;script type="text/javascript" src="d3/d3.js"&gt;&lt;/script&gt;
      &lt;script type="text/javascript" src="d3/d3.geom.js"&gt;&lt;/script&gt;
      &lt;script type="text/javascript" src="d3/d3.layout.js"&gt;&lt;/script&gt;
      &lt;script type="text/javascript"&gt;
  
  var w = 1280,
      h = 800,
      node,
      link,
      root;
  
  var force = d3.layout.force()
      .on("tick", tick)
      .charge(function(d) { return d._children ? -d.size / 100 : -30; })
      .linkDistance(function(d) { return d.target._children ? 80 : 30; })
      .size([w, h - 160]);
  
  var vis = d3.select("body").append("svg:svg")
      .attr("width", w)
      .attr("height", h);
  
  d3.json("flare.json", function(json) {
    root = json;
    root.fixed = true;
    root.x = w / 2;
    root.y = h / 2 - 80;
    update();
  });
  
  function update() {
    var nodes = flatten(root),
        links = d3.layout.tree().links(nodes);
  
    // Restart the force layout.
    force
        .nodes(nodes)
        .links(links)
        .start();
  
    // Update the links…
    link = vis.selectAll("line.link")
        .data(links, function(d) { return d.target.id; });
  
    // Enter any new links.
    link.enter().insert("svg:line", ".node")
        .attr("class", "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; });
  
    // Exit any old links.
    link.exit().remove();
  
    // Update the nodes…
    node = vis.selectAll("circle.node")
        .data(nodes, function(d) { return d.id; })
        .style("fill", color);
  
    node.transition()
        .attr("r", function(d) { return d.children ? 4.5 : Math.sqrt(d.size) / 10; });
  
    // Enter any new nodes.
    node.enter().append("svg:circle")
        .attr("class", "node")
        .attr("cx", function(d) { return d.x; })
        .attr("cy", function(d) { return d.y; })
        .attr("r", function(d) { return d.children ? 4.5 : Math.sqrt(d.size) / 10; })
        .style("fill", color)
        .on("click", click)
        .call(force.drag);
  
    // Exit any old nodes.
    node.exit().remove();
  }
  
  function tick() {
    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; });
  }
  
  // Color leaf nodes orange, and packages white or blue.
  function color(d) {
    return d._children ? "#3182bd" : d.children ? "#c6dbef" : "#fd8d3c";
  }
  
  // Toggle children on click.
  function click(d) {
    if (d.children) {
      d._children = d.children;
      d.children = null;
    } else {
      d.children = d._children;
      d._children = null;
    }
    update();
  }
  
  // Returns a list of all nodes under the root.
  function flatten(root) {
    var nodes = [], i = 0;
  
    function recurse(node) {
      if (node.children) node.size = node.children.reduce(function(p, v) { return p + recurse(v); }, 0);
      if (!node.id) node.id = ++i;
      nodes.push(node);
      return node.size;
    }
  
    root.size = recurse(root);
    return nodes;
  }
  
      &lt;/script&gt;
    &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p>Any guidance and help on this question will be highly appreciated. I need this for my research project.</p>