Radial Tree

by Colin White

HTML

<script src="https://d3js.org/d3.v3.min.js"></script>

CSS

svg {
  display: block;
  margin: auto;
}

.node circle {
  fill: #BCED91;
  stroke: #458B00;
  stroke-width: 2.5px;
}

.node {
  font-family: verdana, sans-serif;
  font-size: 11px;
  font-weight: bold;
  fill: #6B4226;
}

.link {
  fill: none;
  stroke: #BFBFBF;
  stroke-width: 2px;
}

JavaScript

var root = {"name" : "Spring Bars", "children" : [
                    {"name" : "Agelenidae", "children" : [
			    {"name" : "Hobo Spider"},
			    {"name" : "Giant House Spider"},
			    {"name" : "Domestic House Spider"},
			    {"name" : "Dust Spider"}
		    ] },
		    {"name" : "Araneidae", "children" : [
			    {"name" : "Grass Spider"},
			    {"name" : "Cross Orb Weaver"},
			    {"name" : "Banded Garden Spider"},
			    {"name" : "Golden Orb Weaver Spider"},
			    {"name" : "Long-Jawed Orb Weaver Spider"}
		    ] },
                    {"name" : "Theridiidae", "children": [
			    {"name" : "Black Widow Spider"},
			    {"name" : "Brown Widow Spider"},
			    {"name" : "Red Widow Spider"}
		    ] }
                ]};


var diameter = 760;

var tree = d3.layout.tree()
    .size([360, diameter / 2 - 190])
    .separation(function(a, b) { return (a.parent == b.parent ? 1 : 2) / a.depth; });

var diagonal = d3.svg.diagonal.radial()
    .projection(function(d) { return [d.y, d.x / 180 * Math.PI]; });

var svg = d3.select("body").append("svg")
    .attr("width", diameter + 20)
    .attr("height", diameter - 40)
  .append("g")
    .attr("transform", "translate(" + diameter / 2 + "," + diameter / 2 + ")");

  var nodes = tree.nodes(root),
      links = tree.links(nodes);

  var link = svg.selectAll(".link")
      .data(links)
    .enter().append("path")
      .attr("class", "link")
      .attr("d", diagonal);

  var node = svg.selectAll(".node")
      .data(nodes)
    .enter().append("g")
      .attr("class", "node")
      .attr("transform", function(d) { return "rotate(" + (d.x - 90) + ")translate(" + d.y + ")"; })

  node.append("circle")
      .attr("r", 5);

  node.append("text")
      .attr("dy", ".31em")
      .attr("text-anchor", function(d) { return d.x < 180 ? "start" : "end"; })
      .attr("transform", function(d) { return d.x < 180 ? "translate(8)" : "rotate(180)translate(-8)"; })
      .text(function(d) { return d.name;...