簡體   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