2017-06-04 3 views
1

Ich bin auf der Suche nach einer Lösung, wie ich leere Bins entfernen kann, wenn Sie eine Funktion zum Hinzufügen/Entfernen reduzieren.entfernen leere Bins mit reduzieren Add Remove Funktion funktioniert nicht

Ich habe ein jsfiddle here

leeren Behälter entfernt werden, wenn ich eine einfache Summe von ‚Punkte‘ zur Verfügung stellen möchten, aber nicht, wenn ich will eine durchschnittliche Berechnung verwenden und die valueAccessor in den Charts mit.

sind meine Daten wie folgt festgelegt:

{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"}, 

Und mein Ziel ist es durchschnittlich ein ‚Punkte pro Spiel‘ zu schaffen, mit ‚Manager‘, und auch die von ‚Bildung‘.

ich reduzieren bin mit Hinzufügen/Entfernen Funktionen:

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, 
     }; 
    } 

und das Entfernen leerer Behälter Code:

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

Meine Charts Code:

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"; }); 

Alles funktioniert gut , abgesehen von leeren Behältern, werden nicht entfernt, wenn ein Filter angewendet wird.

Ich habe versucht, alle möglichen Dinge zu versuchen, das Problem zu beheben, ändern Sie den WertAccessor der Diagramme und die Funktion remove_empty_bins, aber nichts scheint zu funktionieren.

Meine aktuelle Problemumgehung ist die Bereitstellung von "nicht verwendetem" Text in der Grafik, damit Benutzer wissen, dass der Manager die Formation nicht verwendet hat, aber ich bevorzuge es, leere Bins wie vorgesehen zu entfernen.

Vielen Dank im Voraus für Ihre Hilfe.

+1

nicht direkt auf die Frage bezogen, aber Sie sollten in Ihrem dc des 'd3.round ((p.total/p.count), 2)' Berechnung tun.js 'valueAccessor' und nicht in der Crossfilter-Gruppe. Verwenden Sie einfach die Gruppe, um den "Gesamtwert" und "Anzahl" zu verfolgen. Warum? Angenommen, Sie haben 1000 Datensätze und filtern 500 davon heraus. Diese Berechnung wird während dieses Prozesses 500 Mal ausgeführt, wenn Sie nur einmal ausgeführt werden müssen, wenn Sie den Durchschnitt anzeigen. –

+0

Danke für den Tipp, gut zu wissen. Ich werde die Änderung vornehmen – Kevin

Antwort

2

Ja, remove_empty_bins muss angepasst werden, wenn die Reduzierung ein Objekt statt nur einer Zahl erzeugt.

ich nicht von einer allgemeinen Art und Weise denken kann, dies zu tun, die es nicht ineffizient machen, * so wollen wir die Funktion für diesen Anwendungsfall einstellen:

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

Wir müssen nur ziehen .total aus dem Objekt, weil an object (almost) never equals zero.

Als Bonus habe ich gesetzt auch die Stäbe zu einer festen Höhe in Ihrer Geige:

formationChart 
    .fixedBarHeight(30) 

Ansonsten, wenn es eine einzelne Stange ist, wächst es die gesamte Fläche passen, die viele Menschen betrachte hässlich.

Ich auch Filtering auf die Manager rowChart angewendet. Gabel Ihrer Geige: https://jsfiddle.net/gordonwoodhull/qw0oe8ea/6/

* Vielleicht ist es Zeit, diese in remove_bins() mit einem Prädikat Refactoring? Aber das wird nicht kurz, bis die No-Pfeil-Funktion Browser weggehen.

+0

Danke nochmal Gordon, sehr geschätzt wie immer. Ich habe versucht, alle möglichen verschiedenen Dinge in diesem entfernen leere Behälter Funktion, aber nichts, was ich versuchte, arbeitete! – Kevin

Verwandte Themen