radial Dendrogram for blog
Code as per output from R2D3
by b_g_v
HTML
<script src="http://d3js.org/d3.v3.min.js"></script>
<script type="application/json" id="data">
{
"name": "node48",
"children": [{
"name": "node45",
"children": [{
"name": "node35",
"children": [{
"name": "node25",
"children": [{
"name": "Washington",
"size": 1
}, {
"name": "node15",
"children": [{
"name": "Oregon",
"size": 1
}, {
"name": "node10",
"children": [{
"name": "Wyoming",
"size": 1
}, {
"name": "node6",
"children": [{
"name": "Oklahoma",
"size": 1
}, {
"name": "Virginia",
"size": 1
}]
}]
}]
}]
}, {
"name": "node32",
"children": [{
"name": "Rhode Island",
"size": 1
}, {
"name": "node12",
"children": [{
"name": "Massachusetts",
"size": 1
}, {
"name": "New Jersey",
"size": 1
}]
}]
}]
}, {
"name": "node39",
...
CSS
.node circle {
fill: #fff;
stroke: steelblue;
stroke-width: 1.5px;
}
.node {
font: 15px sans-serif;
}
.link {
fill: none;
stroke: #ccc;
stroke-width: 1.5px;
}
JavaScript
var radius = 800 / 2;
var cluster = d3.layout.cluster()
.size([360, radius - 120]);
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", radius * 2 + 100)
.attr("height", radius * 2 + 100)
.append("g")
.attr("transform", "translate(" + radius + "," + radius + ")");
var data = document.getElementById('data').innerHTML;
root = JSON.parse(data);
var nodes = cluster.nodes(root);
var link = svg.selectAll("path.link")
.data(cluster.links(nodes))
.enter().append("path")
.attr("class", "link")
.attr("d", diagonal);
var node = svg.selectAll("g.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", 4.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;
});
d3.select(self.frameElement).style("height", radius * 2 + "px");