当排序升序时,d3.layout.pack会堆叠圈子

use*_*313 5 javascript sorting d3.js circle-pack

我有一个数据集,当按升序排序时,圆圈最终"堆叠"但在使用空或降序排序时显示正确分布.

上升

降

空值

完整的例子在这里:http://jsfiddle.net/SXLHx/3/.

有人有建议吗?



    sortItems = function(a,b) {
        var str,result;
        switch(sortOrder%3){
            case 0:
                str = 'ascending';
                result = a.size - b.size;
                break;
            case 1:
                str = 'descending';
                result = b.size - a.size;
                break;
            default:
                str = 'null';
                result = null;
        }
        document.getElementById("sortLbl").innerHTML = str;
        return result;
    };

    pack = d3.layout.pack().sort(sortItems);

Run Code Online (Sandbox Code Playgroud)

一些额外的信息:

我发现如果我删除至少两个具有值0的块条目(无论哪两个但它必须是两个),布局就可以了.http://jsfiddle.net/SXLHx/4/

此外,应用过滤器不附加0值的圆圈,如下所示:



    // Create circles
    node.append("circle")
        .filter(function(d){return d.size > 0;})
        .attr("r",function(d){return d.r;});

Run Code Online (Sandbox Code Playgroud)

不纠正布局问题.也许我过滤不正确?

Viv*_*idD 4

您只是在应该设置新顺序和更新布局的代码部分中出现了一些错误。它应该看起来像这样:(它比当前代码中的内容更简单)

pack
  .sort(sortItems)
  .nodes({blocks:data});

node
  .attr("transform",function(d){
      return "translate("+d.x+","+d.y+")";
  })
  .selectAll("circle")
  .attr("r",function(d){return d.r;});
Run Code Online (Sandbox Code Playgroud)

我在包初始化中用这一行解决了零值问题:

.value(function(d){return Math.max(0.01, d.size);});
Run Code Online (Sandbox Code Playgroud)

这是jsfiddle

以下是执行视频:

在此输入图像描述

(请注意,按第三次按钮后,圆圈不会返回原始顺序,但这是由于与原始问题没有直接联系的其他原因(这是关于圆圈包中的升序/降序))。

希望这可以帮助。