1

我从一个定期更新半径的数据集中按照包布局排列了圆圈。

我开始使用的代码是气泡图的标准示例: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":"#"}]}]}]}]} 
4

1 回答 1

1

我有一个类似的问题。

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

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

标签。过渡可能不是最好的,但你可以改变它。

在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);
        });

};
于 2013-12-29T11:44:56.477 回答