2016-05-24 8 views
0

3つの棒がすべて同じスケール(つまり、積み重ねられた棒が100を構成する0〜100の棒)を持つ、D3 - 積み重なった棒グラフの更新に問題がある

データを更新しようとすると、何も起こりそうにありません。私はデータを更新する方法を見つけ出すことができず、それは私を夢中にさせている。

関連するコード:

<body> 
    <div id='updateTest'> 
    Update Data 
    </div> 
    <div id='chart'></div> 


    <script> 
    $(document).ready(function() { 
     $("#updateTest").click(function() { 
      updateData(); 
      console.log(allData[count]); 
     }); 
    }); 

    var institution; 



    // Set up the SVG data 
    var allData = ["data.csv","data2.csv","data3.csv"]; 
    var count = 0; 

    var margin = {top: 20, right: 20, bottom: 145, left: 115}, 
     width = 960 - margin.left - margin.right, 
     height = 300 - margin.top - margin.bottom; 

    var y = d3.scale.ordinal() 
     .rangeRoundBands([height, 0], .1); 

    var x = d3.scale.linear() 
     .rangeRound([0, width]); 

    var color = d3.scale.ordinal() 
     .range(["#98abc5", "#8a89a6", "#7b6888"]); 

    var yAxis = d3.svg.axis() 
     .scale(y) 
     .orient("left"); 

    var xAxis = d3.svg.axis() 
     .scale(x) 
     .orient("bottom") 
     .tickFormat(d3.format(".2s")); 

    var svg = d3.select("#chart").append("svg") 
     .attr("width", width + margin.left + margin.right) 
     .attr("height", height + margin.top + margin.bottom) 
     .append("g") 
     .attr("transform", 
      "translate(" + margin.left + "," + margin.top + ")"); 

    // Bind initial shown data to the SVG 
    d3.csv(allData[count], function(error, data) { 
     if (error) throw error; 

     color.domain(d3.keys(data[0]).filter(function(key) { 
     return key !== "Institution"; 
     })); 

     data.forEach(function(d) { 
     var y0 = 0; 
     d.ages = color.domain().map(function(name) { 
      return {name: name, y0: y0, y1: y0 += +d[name]}; 
     }); 
     d.total = d.ages[d.ages.length - 1].y1; 
     }); 

     data.sort(function(a, b) { return b.total - a.total; }); 

     y.domain(data.map(function(d) { return d.Institution; })); 
     x.domain([0, d3.max(data, function(d) { return d.total; })]); 

     svg.append("g") 
      .attr("class", "x axis") 
      .attr("transform", "translate(0," + height + ")") 
      .call(xAxis); 

     svg.append("g") 
      .attr("class", "y axis") 
      .call(yAxis) 
     .append("text") 
      .attr("transform", "rotate(-90)") 
      .attr("x", -32) 
      .attr("y", -112) 
      .attr("dy", ".71em") 
      .style("text-anchor", "end") 
      .text("Institution"); 

     institution = svg.selectAll(".institution") 
      .data(data) 
     .enter().append("g") 
      .attr("class", "g") 
      .attr("transform", function(d) { 
      return "translate(0," + y(d.Institution) + ")"; }); 

     institution.selectAll("rect") 
      .data(function(d) { return d.ages; }) 
     .enter().append("rect") 
      .attr("height", y.rangeBand()) 
      .attr("x", function(d) { return x(d.y0); }) 
      .attr("width", function(d) { return x(d.y1) - x(d.y0); }) 
      .style("fill", function(d) { return color(d.name); }); 

     var legend = svg.selectAll(".legend") 
      .data(color.domain().slice().reverse()) 
     .enter().append("g") 
      .attr("class", "legend") 
      .attr("transform", function(d, i) { 
      return "translate(0," + i * 28 + ")"; }); 

     legend.append("rect") 
     .attr("x", -20) 
     .attr("y", 190) 
     .attr("width", 25) 
     .attr("height", 25) 
     .style("fill", color); 

     legend.append("text") 
     .attr("x", 10) 
     .attr("y", 203) 
     .attr("dy", ".35em") 
     .style("text-anchor", "left") 
     .text(function(d) { return d; }); 
    }); 

     /* updateData() 
     * Rebinds the SVG to a new dataset 
     */ 
    function updateData() { 
     // Iterate through the data 
     var newData; 
     if (count === allData.length - 1) 
      count = 0; 
     else 
      count++; 
     newData = allData[count]; 


     // Get the data again 
     d3.csv(allData[count], function(error, data) { 
     data.forEach(function(d) { 
       d.close = +d.close; 
      }); 

      // Make the changes 
     institution.selectAll("rect") 
      .data(function(d) { return d.ages; }) 
      .enter().append("rect") 
       .attr("height", y.rangeBand()) 
       .attr("x", function(d) { return x(d.y0); }) 
       .attr("width", function(d) { return x(d.y1) - x(d.y0); }) 
       .style("fill", function(d) { return color(d.name); }); 
     }); 
    } 

    </script> 
</body> 

私のCSVファイル:

data.csv

Institution,CurrentlyOweBehind,CurrentlyOweNotBehind,Paid 
For-profit,15,35,50 
Nonprofit,11,48,41 
Public,26,16,58 

data2.csv

Institution,CurrentlyOweBehind,CurrentlyOweNotBehind,Paid 
For-profit,23,33,44 
Nonprofit,28,12,60 
Public,12,8,80 

data3.csv

Institution,CurrentlyOweBehind,CurrentlyOweNotBehind,Paid 
For-profit,61,22,17 
Nonprofit,7,43,50 
Public,41,19,40 

メインビットはupdateData()機能です。グラフを作成してデータを表示することはできますが、データの移行はわかりません。

コンソールにエラーが表示されず、データが正しく循環しています。

+0

最初の行のこれらのスペースをすべて削除することをお勧めします。 –

+0

真実ですが、ファイルはうまく動作します。私は私を助けるためにそれをもっと使いましたが、あなたは正しいです。一定。 –

答えて

1

問題は更新機能のd.agesにあります。基本的には、最初のプロットと同じ設定が必要です。だから私はあなたの更新機能のd3.csvブロックに以下を追加しました:

data.forEach(function(d) { 
    var y0 = 0; 
    d.ages = color.domain().map(function(name) { 
     return {name: name, y0: y0, y1: y0 += +d[name]}; 
    }); 
    d.total = d.ages[d.ages.length - 1].y1; 
    }); 

    institution = svg.selectAll(".institution") 
     .data(data); 

institutionのクラス名は、何らかの理由グラムに設定され、私は大学にそれを変更しました。また、この時点で.enter().append("rect")は必要ありません。最後に、移行と期間を追加しました。

私はすべてのあなたのcsvファイルで、plunkを作成しているが含ま:このことができますhttp://plnkr.co/edit/CYFNWZKuiLo9gFps49e9?p=preview

希望を。

+0

ああ、大丈夫です。これは私にD3の一般的な更新を理解させるのに非常に役立ちます。 –

関連する問題