2017-01-03 7 views
0

私は以下のようなグラフを持っていますが、私は重要な要素を欠いています。私の現在の時間スケールは標準的なもの(1枚目の写真)ですが、2枚目の写真に見える時間スケールに変換する必要があります。これはD3でも可能ですか?私はD3.js V3を使用しています。私の知る限りD3はその場でカスタムの時間間隔をロールアップするためにすべての機能が含まれていませんが、あなたには、いくつかの基本的なJavaScriptでかなり簡単にこれを行うことができようにそれはそう知っているようD3.jsで日付範囲を時間スケールで個別の日付項目として使用することはできますか?

enter image description here

multi line chart

答えて

1

。 ..

var data = [ 
 
      {date: new Date(2016, 11, 10), value: 1}, 
 
      {date: new Date(2016, 11, 11), value: 2}, 
 
      {date: new Date(2016, 11, 12), value: 3}, 
 
      {date: new Date(2016, 11, 13), value: 3}, 
 
      {date: new Date(2016, 11, 14), value: 2}, 
 
      {date: new Date(2016, 11, 15), value: 3}, 
 
      {date: new Date(2016, 11, 16), value: 5}, 
 
      {date: new Date(2016, 11, 16), value: 4}, 
 
      {date: new Date(2016, 11, 17), value: 2}, 
 
      {date: new Date(2016, 11, 19), value: 3}, 
 
      {date: new Date(2016, 11, 20), value: 1}, 
 
      {date: new Date(2016, 11, 21), value: 3} 
 
     ]; 
 

 
    rollup(data, 3); 
 

 
    function rollup(data, days) { 
 
     var min = data.reduce(function(a, b) {if (b.date < a) return b.date; return a;}, new Date(3000, 1, 1)), 
 
      max = data.reduce(function(a, b) {if (b.date > a) return b.date; return a;}, new Date(1000, 1, 1)), 
 
      output = []; 
 
     for (var day = min; day < max; day.setDate(day.getDate() + days)) { 
 
      var end = new Date(day); 
 
      end.setDate(end.getDate() + days); 
 
      var working = data.filter(function(a) {return (a.date >= day && a.date < end);}), 
 
       value = working.reduce(function(a, b) {return a + b.value;}, 0); 
 
      output.push({date: day.toString() + ' - ' + end.toString(), value: value}); 
 
     } 
 
     console.log(output); 
 
     return output; 
 
    }

+0

こんにちは、コードに感謝サンプル、私はそれを行う方法を持っているかもしれません。私は値を組み合わせる必要はありません。すでに値がサーバから来ていますが、スクリプトで行ったのと同じように、割り当てられた日付と次の値を組み合わせる必要があります。私はそれらを表示するためにd3 'axis.tickValues'関数https://github.com/d3/d3-3.x-api-reference/blob/master/SVG-Axes.md#tickValuesを使う必要があると思います。 – codeepic

+0

ロールアップ関数で 'min'と' max'値を得るために 'reduce'を使っています。これは 'd3.extent'で行うことができます:' x.domain(d3.extent(data、d => d.date)); ' – codeepic

+1

はい、私はtickValuesを達成する方法は序数を使うことです[this post](http://stackoverflow.com/questions/19125559/multi-line-ordinal-d3-chart)のようなあなたのカテゴリによってx軸に沿って表示されます。 'd3.extent'に同意しました。私はプロトタイプ関数を使うことを好みましたが、おそらくこれは良いでしょう。 – abigperson

関連する問題