2014-05-11 85 views
1

我對D3有點新,但仍然有一些理解它的問題。D3 - 圓圈包裝多個數據

我使用本教程Zoomable Circle Packing

不過,我不知道如何加載多個數據集。例如,我需要類似於(you can see on jsfiddle)的東西,但是當按下按鈕時,會加載一個不同的.JSON文件(兩個文件中的名稱相同,但值不同)。

解決方案可能是mbostock的「Thinking with Joins」,但我真的不知道如何使用它。

任何幫助,將不勝感激。

回答

1

您可以使用函數來調用JSON文件加載這樣的:

var callJson = function (json) { 
    d3.json(json, function(error, root) { 
    if (error) return console.error(error); 

    svg.selectAll("circle").remove(); 
    svg.selectAll("text").remove(); 

    var focus = root, 
     nodes = pack.nodes(root), 
     view; 

    var circle = svg.selectAll("circle") 
     .data(nodes) 
     .enter().append("circle") 
     .attr("class", function(d) { return d.parent ? d.children ? "node" : "node node--leaf" : "node node--root"; }) 
     .style("fill", function(d) { return d.children ? color(d.depth) : null; }) 
     .on("click", function(d) { if (focus !== d) zoom(d), d3.event.stopPropagation(); }); 

    var text = svg.selectAll("text") 
     .data(nodes) 
     .enter().append("text") 
     .attr("class", "label") 
     .style("fill-opacity", function(d) { return d.parent === root ? 1 : 0; }) 
     .style("display", function(d) { return d.parent === root ? null : "none"; }) 
     .text(function(d) { return d.name; }); 

    var node = svg.selectAll("circle,text"); 

    d3.select("body") 
     .style("background", color(-1)) 
     .on("click", function() { zoom(root); }); 

    zoomTo([root.x, root.y, root.r * 2 + margin]); 

    function zoom(d) { 
     var focus0 = focus; focus = d; 

     var transition = d3.transition() 
      .duration(d3.event.altKey ? 7500 : 750) 
      .tween("zoom", function(d) { 
      var i = d3.interpolateZoom(view, [focus.x, focus.y, focus.r * 2 + margin]); 
      return function(t) { zoomTo(i(t)); }; 
      }); 

     transition.selectAll("text") 
     .filter(function(d) { return d.parent === focus || this.style.display === "inline"; }) 
      .style("fill-opacity", function(d) { return d.parent === focus ? 1 : 0; }) 
      .each("start", function(d) { if (d.parent === focus) this.style.display = "inline"; }) 
      .each("end", function(d) { if (d.parent !== focus) this.style.display = "none"; }); 
    } 

    function zoomTo(v) { 
     var k = diameter/v[2]; view = v; 
     node.attr("transform", function(d) { return "translate(" + (d.x - v[0]) * k + "," + (d.y - v[1]) * k + ")"; }); 
     circle.attr("r", function(d) { return d.r * k; }); 
    } 
    }); 
}; 

...然後你callJson("flare.json");

這裏正在與多個JSON文件的例子稱之爲 - http://bl.ocks.org/chule/74e95deeadd353e42034

+0

Thx快速響應,這是完美的! :) – Ficho

+0

另外,我必須補充一點,我不希望收到與我住在同一個城市的人的回答。波茲拉夫是奧西耶卡(學生ETF-a)。 – Ficho

+0

大聲笑,我從來沒有料到將來自我的小鎮的人回答了stackoverflow/d3的問題。乾杯! – cuckovic