2017-06-04 1 views
1

reduce Add/Remove関数を使用して空のビンを削除する方法を探しています。 reduceを使用して空のビンを削除Add Remove関数が機能しない

は、私が「ポイント」の単純な合計を提供したいときjsfiddle here

空のビンが削除されていますが、私は平均計算を使用してチャートにvalueAccessorを使用したくないとき。 、また、「形成」によって

{Season:"2016/17", 
Manager:"Alan Curtis", 
Points:1, 
Formation:"4231", 
date:"01 February 2017"}, 

{Season:"2016/17", 
Manager:"Paul Clement", 
Points:1, 
Formation:"442", 
date:"01 February 2018"}, 

{Season:"2015/16", 
Manager:"Paul Clement", 
Points:3, 
Formation:"433", 
date:"01 May 2017"}, 

をそして、私の目的は、「マネージャ」で、平均「ゲームごとのポイント」を提供することである。

私のデータは以下のように設定されています。

私は機能の追加/削除減らす使用しています:

function reduceAdd(p, v) { 
    p.total += v.Points; 
    ++p.count; 
    p.ppg = d3.round((p.total/p.count), 2); 
    return p; 
    } 

function reduceRemove(p, v) { 
    p.total -= v.Points; 
    --p.count; 
    p.ppg = d3.round((p.total/p.count), 2); 
    return p; 
    } 

function reduceInitial() { 
    return { 
     total: 0, 
     count: 0, 
     ppg: 0, 
     }; 
    } 

と削除、空ビンコード:

function remove_empty_bins(source_group) { 
return { 
    all:function() { 
     return source_group.all().filter(function(d) { 
      return d.value !=0; 
     }); 
    } 
}; 
} 

マイグラフコード:

managerChart 
    .dimension(dimManager) 
    .group(ManagerPPGGroup) 
    .ordering(function(p) { return -p.value.ppg }) 
    .renderLabel(false) 
    .othersGrouper(null) 
    .renderTitle(false) 
    .renderTitleLabel(true) 
    .margins({top: 10, left: 10, right: 20, bottom: 80}) 
    .valueAccessor(function(p) 
     { if (p.value.ppg >0) { 
     return p.value.ppg } else { return "n/a"}; }); 

formationChart 
    .dimension(dimFormation) 
    .group(filteredFormationPPGGroup) 
    .ordering(function(p) { return -p.value.ppg }) 
    .renderLabel(false) 
    .cap(10) 
    .elasticX(true) 
    .renderTitle(false) 
    .renderTitleLabel(true) 
    .margins({top: 10, left: 10, right: 20, bottom: 80}) 
    .valueAccessor(function(p) { return p.value.count > 0 ? p.value.ppg : "not used"; }); 

をすべてが正常に動作します空のビンは別として、フィルターが適用されても除去されない。

私はチャートのvalueAccessorとremove_empty_bins関数を変更して問題を解決しようとしましたが、何も動作していないようです。

現時点での回避策は、グラフに「使用されていない」テキストを表示して、Managerが編成を使用していないことをユーザーに知らせることですが、空のビンを意図したとおりに削除することをお勧めします。

ご協力いただきありがとうございます。

+1

直接質問には関係ありませんが、あなたのdcで 'd3.round((p.total/p.count)、2)'の計算を行うべきです。jsの 'valueAccessor'であり、Crossfilterグループではありません。グループを使って 'total'と' count'を追跡してください。どうして?たとえば、1000個のレコードがあり、500個のレコードを除外したとします。この計算は、平均を表示したときに一度だけ実行する必要があるときに、そのプロセス中に500回実行されます。 –

+0

チップをありがとう、知っておいてよかった。私は変更を行います – Kevin

答えて

2

はい、還元が単なる数値ではなくオブジェクトを生成する場合は、remove_empty_binsを調整する必要があります。

私はそれが非効率的にすることはありませんこれを行うには、任意の一般的な方法を考えることはできません

ので、*のは、このユースケースのための機能を調整してみましょう

function remove_empty_bins(source_group) { 
    return { 
     all:function() { 
      return source_group.all().filter(function(d) { 
       return d.value.total != 0; 
      }); 
     } 
    }; 
} 

は、私達はちょうどプルする必要がありますオブジェクトの.totalan object (almost) never equals zeroのため。 1つのバーがあるとき

formationChart 
    .fixedBarHeight(30) 

がそうでなければ、それは全体の面積に合わせて成長します、多くの人々:ボーナスとして

、私はまた、あなたのフィドルに固定高さにバーを設定しました醜いと思う。

また、マネージャのrowChartにフィルタリングを適用しました。あなたのフィドルのフォーク:https://jsfiddle.net/gordonwoodhull/qw0oe8ea/6/

*は、多分それは述語でremove_bins()にこれをリファクタリングする時が来ましたか!しかし、矢印機能のないブラウザーがなくなるまで、それは簡潔にはなりません。

+0

ありがとう、ゴードンは、いつものように高く評価されました。私は空のビンの機能を削除するには、私が働いたことは何もないすべての種類のさまざまなことを試みた! – Kevin

関連する問題