【问题标题】:Avoid overlapping of child nodes in D3.js避免 D3.js 中的子节点重叠
【发布时间】:2014-09-23 08:18:24
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: javascript jquery facebook d3.js


    【解决方案1】:

    实现此目的的一种方法是设置tree layoutnodeSizeseparation 属性。这是sn-p:

    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 answer)。

    这里是 FIDDLE 的更改。我在不同深度添加了另一行圆圈,以检查解决方案是否足够稳健。我认为这应该能让你继续前进。

    【讨论】:

    • 非常感谢您的回复...请问如何更改最后一行(3张图片)的链接以连接到父节点?
    • @Kentarou YW。该问题的初衷是解决重叠问题。如果答案解决了这个问题,您应该接受答案。至于您评论中的问题,最后一行是指我添加到您原始数据中的行吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多