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

时间:2014-05-16 16:09:00

标签: javascript sorting d3.js circle-pack

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

ascending

descending

null

完整的示例在这里: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);

其他一些信息:

我发现,如果我删除至少两个具有值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;});

不会更正布局问题。也许我过滤不正确?

1 个答案:

答案 0 :(得分: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;});

我在包初始化中使用此行解决了零值:

.value(function(d){return Math.max(0.01, d.size);});

这是jsfiddle

以下是执行视频:

enter image description here

(请注意,在第三次按下按钮后,圆圈不会返回到原始顺序,但这是由于其他原因导致无法直接连接到原始问题(这与圆形包装中的升序/降序有关) ))。

希望这有帮助。