2017-06-28 31 views
0

私は珍しい積み上げ棒グラフを行う必要があるとacutally、私はどのようにそれを行うには本当の考えを持っていません。一般的にD3珍しい積み上げ棒グラフ

それは本当に簡単に聞こえる:

私はint型または文字列のいずれかであることができる、異なる値を持つCSVファイルを持っています。各行は同じ量の値を持ちます。

が、私は今、次のことを行い積み上げ棒グラフ実行する必要があります。 -every列が同じ高さを持っている必要が列ごとに

-Oneバーを (各列のエントリの同じ量を引き起こす)と各バーには、異なる量のスタックごとに1つのスタックが存在する必要があります。 (より頻繁に値が存在し、大きなスタックがなければならない)

例えばCSVファイルは次のようになります

Day, Value 
Mo, 5 
Mo, 3 
Tu, 5 
Tu, 6 

だから日行のiが2つのスタック同じ高さを必要とし、値行に対して1つが1/2の高さであり、他の2つがそれぞれ1/4である3つのスタック。

そして、それは私が持っている問題です。私はインターネット上で見つけることができるすべての例は、各バーのスタックの同じ量で動作します。 (例:https://bl.ocks.org/mbostock/3886394またはhttps://bl.ocks.org/mbostock/1134768

どのように私はこの問題を解決できますか?

答えて

0

あなたは別のスタックとして各列を処理し、あなたのチャートでそれらを配置する必要があります。このフィドル:https://jsfiddle.net/gwhn1sgv/2/はどのように表示されます。

iのデータ。 e。最初の列、このようなヒストグラムに変換する必要があります

var column = 'Day'; 
var histo = { Mo: 2, Tu: 2 } 

その後、あなたがそれらをスタックして変換することができます:

var keys = Object.keys(histo); 
var stack = d3.stack() 
    .keys(keys)([histo]) 
    //unpack the column 
    .map((d, i) => { 
    return {key: keys[i], data: d[0]} 
    }); 

ので、彼らは次のようになります。あなたの場合は

var stack = [ 
    { key: 'Mo', data: [0, 2] }, 
    { key: 'Tu', data: [2, 4] } 
] 

バンドスケールを有する

var x = d3.scaleBand() 
    .domain(data.columns); 

あなたがx(column)で棒グラフの列を構築することができます。

chart.append('g') 
    .selectAll('rect') 
    .data(stack) 
    .enter().append('rect') 
    // position in the x-axis 
    .attr('x', x(column)) 
    .attr('y', d => y(d.data[0])) 
    .attr("height", d => y(d.data[1]) - y(d.data[0])) 
    .attr("width", x.bandwidth()); 
+0

どうもありがとうございました!私は明日これを暗示しようとしますが、それは私の問題を解決するようです – Grogak

+0

もう一度、私はもう一度... 私はもう2つの質問があり、1日を試した後、私はあきらめます。 最初に: 10〜20列のより大きなCSVファイルがあり、それを4〜5個の特定の列だけで構築したいとしたら、どの列を使用したいのですか? 私は試しました: 'd3.keys(data [0])。filter(function(d){return d.match(/.../);})' これを実装する必要があります。私は最初のところだと思いますが、どうですか? 2番目:各スタック間に少しのスペースを追加する可能性はありますか? 実際には私自身でこれをやりたいのですが、私はd3のために鈍いと思われます。 – Grogak

+0

1。csvを 'data'にロードした後、' for ... of'ループの前に 'data.columns.filter()'を直接追加してください。 2行目のように 'x.padding()'メソッドを使います。 – ccprog

関連する問題