避免D3.js中的子节点重叠



我正在构建一个树结构,显示使用D3.js的Facebook用户和他/她的Facebook好友。根节点是用户,子节点是好友。我的UI中有一个固定的宽度,问题是子节点会相互重叠。

              var nodes = tree.nodes(root).reverse(),
               links = tree.links(nodes);
              nodes.forEach(function(d) { d.y = d.depth * 130; });
              var node = svg.selectAll("g.node")
               .data(nodes, function(d) { return d.id || (d.id = ++i); });
              var nodeEnter = node.enter().append("g")
               .attr("class", "node")
               .attr("value", function(d){
                return d.id; })
               .attr("transform", function(d) { 
                return "translate(" + d.x + "," + d.y + ")"; });
              var defs = node.append("defs").attr("id", "imgdefs");
              var imgPattern = defs.append("pattern")
                    .attr("id", "img")
                    .attr("height", 50)
                    .attr("width", 50)
                    .attr("x", "0")
                    .attr("y", "0");

                imgPattern.append("image")
                     .attr("height", 60)
                     .attr("width", 60)
                     .attr("xlink:href", function(d) { return d.img; });
                nodeEnter.append("circle")
                    .attr("r", 30)
                    .style("stroke","white")
                    .style("stroke-width", 4)
                    .attr("fill", "url(#img)");

我想为子节点显示每行/深度10个好友。请提供任何帮助或建议。非常感谢。

这是我的jsfiddle:CODE Here

实现这一点的一种方法是设置树布局的nodeSizeseparation属性。以下是片段:
var tree = d3.layout.tree()
    //.size([height, width])
    .nodeSize([30,])
    .separation(function separation(a, b) {
        return a.parent == b.parent ? 2 : 1;
    });

我将nodeSize属性的x维度设置为等于圆的半径。

此外,g变换的变化对于重新定位图表是必要的:

.attr("transform", "translate(" + (margin.left + width/2) + "," + margin.top + ")");

您可以安全地忽略size属性(请参阅上面链接中的文档和此SO答案)。

这是一个带有更改的FIDDLE。我在不同的深度添加了另一排圆圈,以检查解决方案是否足够稳健。我想这应该会让你走的。

最新更新