树形图直观的反应了数据之间的层次关系是现实应用中使用的比较普遍的一类图形化数据表示方法,使用d3.js绘制树状图的过程中,采取横纵坐标交换方式,可实现思维导图形式的树状图,示例代码如下:
var width = 800,
height = 800;
//====================separation 表示设置节点间间隔,采用思维导图方式展示树状图,需要保持画板宽度大于画板高度=================================
var tree = d3.layout.tree()
.size([width, height-150])
.separation(function (a, b) { return (a.parent == b.parent ? 1:2); });
var diagonal = d3.svg.diagonal()
.projection(function (d) { return [d.y, d.x]; });
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(40,0)");
d3.json("../data/city.json", function (error, root) {
var nodes = tree.nodes(root);
/*nodes.forEach(function (d) {
d.y=
});
*/
//=============通过改变节点坐标,重新设置节点间的连线长度
nodeSeperateSpace = 5;
nodes.forEach(function (d) {
d.x = d.x + d.depth * nodeSeperateSpace;
//if (d.depth==0)
d.y = d.y - d.depth*50;
//else
//d.y = d.y - 150;
});
var links = tree.links(nodes);
console.log(nodes);
console.log(links);
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 "translate(" + d.y + "," + d.x + ")"; })
//============未设置圆的圆心坐标者,默认为0,0===============
node.append("circle")
.attr("r", 4.5);
node.append("text")
.attr("x", function (d) { return d.children ? -8 : 8; })
.attr("y", 3)
.style("text-anchor", function (d) { return d.children ? "end" : "start"; })
.text(function (d) { return d.name; });
});