繁体   English   中英

在移动/尺寸转换后,d3包布局圆重叠

[英]d3 pack layout circles overlapping after movement/size transitions

我从定期更新半径的数据集中安排了包布局的圆圈。

我开始使用的代码是此气泡图的标准示例: http : //bl.ocks.org/mbostock/4063269

在此处输入图片说明

只要圆的大小发生变化,它们就会过渡。 通常,当圆圈增长时,它们会移动到与其他圆圈重叠。 我不希望他们彼此重叠。

我对d3还是很陌生,已经将代码移动了很多,并尝试了我能想到的一切,但是没有运气。

函数makeBubbles是通过原始Json传递的(请参见下文)。

function makeBubbles(root){
  var diameter = $(window).width(),
      diameterh = $(window).height(),
      format = d3.format(",d"),
      color = d3.scale.category20();

  var bubble = d3.layout.pack()
      .sort(null)
      .size([diameter, diameterh])
      .value(function(d){return d.value; })
      .padding(1.5);

  var svg = d3.select("svg")
      .attr("width", diameter)
      .attr("height", diameterh)
      .attr("class", "bubble");

  var node = svg.selectAll(".node")
      .data(bubble.nodes(classes(root)).filter(function(d) { return !d.children; }),     function(d){  console.log(d); return d.className; });


  node.append("title")
      .text(function(d) { return d.className + ": " + format(d.value); });

  node.append("circle")
      .style("fill", function(d) { return color(d.packageName); })
      .on("click", function(d) { window.location = d.url; })
      .attr("r", 0)
      .transition()
      .duration(1000)
      .attr("r", function(d) { return d.r; });

  node.transition().duration(1000).attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

  node.enter().append("g")
      .attr("class", "node")
      .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

  node.exit().transition().duration(200).attr("transform", "scale(0.001)").remove();

  node.append("text")
      .attr("dy", ".3em")
      .style("text-anchor", "middle")
      .text(function(d) { return d.className.substring(0, d.r / 6); })
      .attr("opacity",0)
      .transition().duration(1000)
      .attr("opacity",1);

// Returns a flattened hierarchy containing all leaf nodes under the root.
  function classes(root) {
    var classes = [];

    function recurse(name, node) {
      if (node.children) node.children.forEach(function(child) { recurse(node.name, child);     });
      else classes.push({packageName: name, className: node.name, value: node.size, url: node.url});
    }

    recurse(null, root);
    return {children: classes};
  }

  d3.select(self.frameElement).style("height", diameterh + "px");
}

传递的数据如下所示(随着数据集的更新而变化):

{"name":"bubbles","children":[{"name":"tourism","children":[{"name":"tourism","children":[{"name":"practical","children":[{"name":"ACCOMM","size":13,"url":"#"},{"name":"HIRE","size":2,"url":"#"}]},{"name":"activity","children":[{"name":"EVENT","size":6,"url":"#"},{"name":"TOUR","size":3,"url":"#"}]},{"name":"leisure","children":[{"name":"RESTAURANT","size":168,"url":"#"},{"name":"ATTRACTION","size":8,"url":"#"}]}]}]}]} 

我有一个类似的问题。

我稍微修改了(大部分简化了)您的代码, 在这里您可以找到有效的示例。

我的方法是不使用转换。 没有它们,代码看起来更具可读性和可维护性。 因此,我提出一个简单的解决方案,希望您可以在自己的情况下使用它。

标签。 过渡也许不是最好的,但是您可以更改它。

在jsfiddle上,无法集成json文件,因此数据位于javascript中。 在您的代码中,您将需要处理json的加载,但是示例中的核心思想可以不加更改地应用。

关键功能是:

function updateVis() {

    if (dataSource == 0)
        pack.value(function(d) { return d.size; });
    if (dataSource == 1)
        pack.value(function(d) { return 100; });
    if (dataSource == 2)
        pack.value(function(d) { return 1 +
                 Math.floor(Math.random()*501); });

    var data1 = pack.nodes(data);

    titles.attr("x", function(d) { return d.x; })
        .attr("y", function(d) { return d.y; })
        .text(function(d) {
            return (d.children ? "" : d.name + ": " + format(d.value));
        });

    circles.transition()
        .duration(5000)
        .attr("cx", function(d) { return d.x; })
        .attr("cy", function(d) { return d.y; })
        .attr("r", function(d) { return d.r; });

    labels.transition()
        .duration(5000)
        .attr("opacity", 0) 
        .attr("x", function(d) { return d.x; })
        .attr("y", function(d) { return d.y; })
        .each("end", function(d){
            d3.select(this).text(function(d) {
                    return d.children ? "" : d.name.substring(0, d.r / 4);
                });
            d3.select(this).transition()
                .duration(1000)
                .attr("opacity", 1);
        });

};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM