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 に答える