2017-05-17 7 views
1

米国の州ごとの統計のエリアチャートを作成しようとしています。私は各状態について単一の数値統計を持っています。私のデータリストの要素は、以下のようになります。D3カテゴリカルチャート - スケール問題

{'state':'CA','count':4000} 

現在、私の面グラフはthisのように見えます。タスクは主に完了していますが、最後のカテゴリ(この場合はUTAH)がどのように満たされていないかに気づくことがあります。私はこれを回避する方法についてはあまりよく分かりません。 close_up

私はscaleBand軸を使用しています。これは適切だと感じました。おそらくそれは正しいアプローチではないでしょう。グラフの後ろにあるJSは次のとおりです。

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

var x = d3.scaleBand().range([0, width]), 
    y = d3.scaleLinear().range([height, 0]); 

var area = d3.area() 
    .x(function(d) { return x(d.state); }) 
    .y0(height) 
    .y1(function(d) { return y(d.count); }); 

d3.csv('data/states.csv', function(data) { 

    data.forEach(function(d) { 
    d.count = +d.count; 
    }); 

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

    data = data.slice(0,30); 

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

    g_area.append('path') 
     .datum(data) 
     .attr('fill', solar[1]) 
     .attr("class", "area") 
     .attr('d', area); 

    g_area.append("g") 
     .attr("class", "x-axis") 
     .attr("transform", "translate(0," + height + ")") 
     .call(d3.axisBottom(x)); 

    g_area.append("g") 
     .attr("class", "y-axis") 
     .attr("transform", "translate(0," + 0 + ")") 
     .call(d3.axisLeft(y)); 
}); 

私はこれをどのように修正することができますか?フィードバックありがとう!

+0

あなたもあなたのデータを共有できますか?ユタのデータは0かもしれません。 – Cyril

+0

@Cyrilすべてのステートに0以外のカウントがあります。ユタ州は1866年です。 – Sam

答えて

3

あなたの質問のタイトル(現在編集中)とは対照的に、エリアチャートは"最後のデータポイントを残して"ではありません。

あなたが見ているのは、あなたがバンドスケールを使用しているために期待される結果です。実際には、水平軸のちょうど上の値(エリアチャートの「端」)は、ユタの値です!この説明で理解してみてください。あなたのデータが入った棒グラフを想像してみてください。各バーは、もちろん、所定の幅を有する。今度は、の左上ののコーナーから、バーの左上のコーナーまで、最初のバーから始まり、最後のバーに達すると、左上から軸。それは今あなたが持っている分野です。

ここには2つの解決策があります。最初のものではなく、ポイントスケールを使用している:

var x = d3.scalePoint().range([0, width]) 

しかし、これが第1の状態の前に、エリアパスの「マージン」トリムと最後の状態(ユタ州)の後であろう。つまり、エリアチャートはカリフォルニアティックのすぐ上から始まり、ユタのダニの右端で終了します。

あなたがハックされ第二の溶液が存在することを望んでいないが、これらの「余白」を続ける場合は、次のエリアの発電機の最後の状態にbandwidth()を追加します。

var area = d3.area() 
    .x(function(d, i) { 
     return i === data.length - 1 ? 
      x(d.state) + x.bandwidth() : x(d.state) 
    }) 

それは可能バンドスケールを使用すると、チャートが技術的に間違っていることに気付くことはありません。各ステートのエリア内の値は、そのステートのティックを超えていません。

+0

何が起こっているかについての素晴らしい説明に感謝します!そして、あなたはその最終的な発言に間違いないでしょう。この場合にはポイントスケールが道でした。 – Sam

関連する問題