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.
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
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
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