javascript - 避免 D3.js 中子节点重叠

标签 javascript jquery facebook 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 个 friend 。请提供任何帮助或建议。谢谢!

这是我的jsfiddle:CODE HERE

最佳答案

实现此目的的一种方法是设置 tree layoutnodeSizeseparation 属性。 。这是片段:

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随着变化。我在不同深度添加了另一行圆圈,以检查解决方案是否足够稳健。我想这应该能让你继续前进。

关于javascript - 避免 D3.js 中子节点重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25990218/

相关文章:

jquery - 隐藏输入类型单选按钮并显示标签时,如何使用箭头键在单选按钮之间导航?

android - 使用 Android Facebook SDK 3.0 在墙上张贴带有消息的图片

javascript - CKEditor 4.6 图片上传上传后不插入图片URL

javascript - NVD3 为饼图的单个切片创建点击事件

javascript - 将输入放入 JavaScript 表中

javascript - 在jade模板中显示mongodb集合

javascript - 如何在我的网站上添加 "Add to Favorites"按钮或链接?

c# - 在 MVC 中按字母顺序排列 SelectList

android - 使用 Android SDK 将视频或图像上传到 facebook

php - 使用 Facebook PHP SDK 确定用户是否喜欢我的页面?