2016-12-07 2 views
3

D3のパックサークルチャートで子供の円の色を設定したいと思います。名前のテキストの下に表示されるサイズのテキストも好きです。これをどのように達成するのですか?下の例では、jsonにカラーコードを追加しました。 JSfiddleへのリンクは、これはD3スクリプトD3ズームパック円の子供の色を設定する方法

<script src="https://d3js.org/d3.v4.min.js"></script> 
<script> 

var svg = d3.select("svg"), 
    margin = 20, 
    diameter = +svg.attr("width"), 
    g = svg.append("g").attr("transform", "translate(" + diameter/2 + "," + diameter/2 + ")"); 

var color = d3.scaleLinear() 
    .domain([-1, 5]) 
    .range(["hsl(152,80%,80%)", "hsl(228,30%,40%)"]) 
    .interpolate(d3.interpolateHcl); 

var pack = d3.pack() 
    .size([diameter - margin, diameter - margin]) 
    .padding(2); 

d3.json("/flare.json", function(error, root) { 
    if (error) throw error; 

    root = d3.hierarchy(root) 
     .sum(function(d) { return d.size; }) 
    .sort(function(a, b) { return b.value - a.value; }); 

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

    var circle = g.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 = g.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 ? "inline" : "none"; }) 
     .text(function(d) { return d.data.name; }); 

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

    svg 
     .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; }) 
     .on("start", function(d) { if (d.parent === focus) this.style.display = "inline"; }) 
     .on("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; }); 
    } 
}); 

</script> 

助けてくれてありがとうですhttps://jsfiddle.net/smitty1788/9fw51gL1/1/

{ 
     "name": "Maryland", 
     "children": [{ 
      "name": "Montgomery", 
      "children": [{ 
       "name": "French", 
       "size": 600, 
       "fill":"#105908" 
      }, { 
       "name": "Italian", 
       "size": 700, 
       "fill":"#59084e" 
      }, { 
       "name": "Laotian", 
       "size": 800, 
       "fill":"#f45333" 
      }, { 
       "name": "African Languages", 
       "size": 900, 
       "fill":"#fFF000" 
      }] 
     } 

です!

+1

あなたのコードは、いくつかのNaNを返します。だから、あなたのコードでフィダー/プランカーを設定するのを待つのではなく、データをハードコーディングし、エラーをデバッグして、あなたの質問に答えるだけで、働くフィドル/プランカを提供します。そうすれば、人々はあなたの特定の質問にのみ集中することができ、より速く助けを得ることができます。 –

+0

ありがとうございます!主な質問にJSfiddleリンクを追加しました。 https://jsfiddle.net/smitty1788/9fw51gL1/1/ –

+0

私はちょうど答えを書いた...物事は働く(または動作しない)フィドルで簡単です! –

答えて

2

代わりのnull、子供なしの円のためd.data.fillを返します。ここでは

.style("fill", function(d) { return d.children ? color(d.depth) : d.data.fill; }) 

は、あなたの更新フィドルは(あなたの色の円が右端にある)である。https://jsfiddle.net/jv4ku850/

+0

これは素晴らしいことです!本当にありがとう!最終製品に興味がある場合に備えて、私は完全なデータセットでフィディルドを更新しました。 https://jsfiddle.net/smitty1788/jv4ku850/1/ –

+0

あなたの色が機能していることを確認してください! –

+0

これは素晴らしい答えです@GerardoFurtado。 jsonの個々の子供にカラーコードを追加するのではなく、代わりの方法がありますか?私は、同じ子供たちが同じ色を自動的に割り当てられる方法があるのでしょうか? – ComplexData