2013-07-16 10 views
6

jsFiddle: http://jsfiddle.net/PYeFP/Aggiunta di un filtro in dc.js/Crossfilter non aggiorna la tabella

Ho un grafico a barre set up che grafici diversi utenti dei viaggi di giorno

 tripVolume = dc.barChart("#trip-volume") 
       .width(980) // (optional) define chart width, :default = 200 
       .height(75) // (optional) define chart height, :default = 200 
       .transitionDuration(0) // (optional) define chart transition duration, :default = 500 
       .margins({ top: 10, right: 50, bottom: 30, left: 40 }) 
       .dimension(tripsByDateDimension) // set dimension 
       .group(tripsByDateGroup) // set group 
       // (optional) whether chart should rescale y axis to fit data, :default = false 
       .elasticY(false) 
       // (optional) whether chart should rescale x axis to fit data, :default = false 
       .elasticX(false) 
       // define x scale 
       .x(d3.time.scale().domain([tripsByDateDimension.bottom(1)[0].startDate, tripsByDateDimension.top(1)[0].startDate ])) 
       // (optional) set filter brush rounding 
       .round(d3.time.day.round) 
       // define x axis units 
       .xUnits(d3.time.days) 
       // (optional) whether bar should be center to its x value, :default=false 
       .centerBar(true) 
       // (optional) render horizontal grid lines, :default=false 
       .renderHorizontalGridLines(true) 
       // (optional) render vertical grid lines, :default=false 
       .renderVerticalGridLines(true) 
       .brushOn(false); 

Il grafico bene ma vorrei filtrarlo usando alcuni controlli jQuery. Quando l'utente seleziona la data in cui sto cercando di aggiungere un filtro al grafico, il filtro viene aggiunto ma il grafico non cambia, anche se I redraw() o render().

Questo è come il crossfilter è messa a punto:

tripsCx = crossfilter(data.rows); 
var allTripsGroup = tripsCx.groupAll(); 

var tripsByDateDimension = tripsCx.dimension(function (d) { return d.startDate; }); 
var tripsByDateGroup = tripsByDateDimension.group(d3.time.day); 

I seguenti sono alcuni dei metodi che ho usato per cercare di applicare un filtro:

Questo dovrebbe utilizzare il filterRange:

d.filter(d.dimension().top(20)[19], d.dimension().top(20)[0]); 

FilterFunction:

d.filter(function (d) { 
    return d.getTime() > start.valueOf() && d.getTime() < end.valueOf(); 
}); 

FilterExact:

d.filter(d.dimension().top(20)[0]); 

Ho anche provato bypassando il grafico e l'applicazione del filtro direttamente sulla dimensione:

d.dimension().filterFunction(function (d) { 
    return d.getTime() > start.valueOf() && d.getTime() < end.valueOf() 
}); 

Nulla ho fatto fa sì che il grafico di cambiare.

Sto iniziando a pensare che ho l'aspettativa sbagliata di cosa dovrebbe fare la funzione filtro?

Come posso filtrare manualmente i dati nella dimensione per aggiornare il grafico? Non voglio usare un pennello. Filtrerò i dati in base a criteri diversi, sto solo cercando di far funzionare il caso semplice per primo.

Ho trascorso un paio di giorni su questo ora e sono in perdita su cosa provare dopo.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

8

Hai provato a reimpostare la proprietà x del grafico dopo aver impostato il filtro crossfilter

Ho un caso in qualche modo simile e quello che faccio dopo ogni azione che cambia i valori filtrati è qualcosa sulla falsariga di

.x (..). Dimensione (...). Gruppo (...)

dopo la creazione/l'impostazione dei filtri

provato a fare qualcosa di simile

$('#filter').on('click', function(){ 
    var minDate = tripsByDateDimension.top(5)[4].startDate; 
    var maxDate = tripsByDateDimension.top(5)[0].startDate; 
    console.log(tripVolume.filters()); 


    tripVolume.filter([minDate, maxDate]); 
    tripVolume.x(d3.time.scale().domain([minDate,maxDate])); 

    console.log(tripVolume.filters()); 

    dc.redrawAll() 
}); 

http://jsfiddle.net/PYeFP/5/

Meglio risposta per la discussione nel commento è quello di aggiungere il filtro alla dimensione, non il grafico

Infine, è necessario rendersi conto di quanto menzionato in https://github.com/square/crossfilter/wiki/API-Reference#group-map-reduce

Nota: un raggruppamento interseca i filtri correnti del filtro incrociato, ad eccezione del filtro della quota associata. Pertanto, i metodi di gruppo considerano solo i record che soddisfano tutti i filtri tranne il filtro di questa dimensione. Quindi, se il filtro incrociato dei pagamenti viene filtrato per tipo e totale, il gruppo per totale osserva solo il filtro per tipo.

(vedi anche https://groups.google.com/d/msg/dc-js-user-group/UFxvUND7hmY/btbAjqIIzl8J)

+0

Grazie, ho commentato la riga in cui si applica il filtro nella jsfiddle aggiornato e il grafico ancora cambiato. Cambiare la scala dell'asse X sembra funzionare sul grafico a barre, ma non penso che filtri i dati sottostanti. Mi sto chiedendo specificatamente dei filtri perché voglio che funzioni con tutti i grafici dc js. Un altro problema con l'asse x è che non posso fare filtri più complicati come avrebbe fornito il filtroFunction. Grazie per la risposta però. – DannyLane

+1

Capisco cosa intendi. Fammi riprovare :). L'aggiunta del filtro alla dimensione, non al grafico sembra fare la differenza. Http://jsfiddle.net/PYeFP/8/ funziona per te? – Peter

+0

Questo è un po 'utile in quanto posso vedere che un filtro è possibile di aggiornare un grafico. Il problema è che è stata creata una dimensione extra, non risponde perché non posso filtrare sul mio oggetto startDate. Ho aggiornato il violino con una funzione filtro, nei registri puoi vedere che il numero di elementi va da 13 a 9, ma il grafico non si aggiorna. http://jsfiddle.net/PYeFP/9/ – DannyLane