Добавление фильтра в dc.js / Crossfilter без обновления диаграммы
jsFiddle:http://jsfiddle.net/PYeFP/
У меня настроена гистограмма, которая отображает количество поездок пользователей за день
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);
График отображается нормально, но я хотел бы отфильтровать его, используя некоторые элементы управления jQuery. Когда пользователь выбирает дату, когда я пытаюсь добавить фильтр на диаграмму, фильтр добавляется, но диаграмма не меняется, даже если яredraw()
или жеrender()
.
Вот как настроен кроссфильтр:
tripsCx = crossfilter(data.rows);
var allTripsGroup = tripsCx.groupAll();
var tripsByDateDimension = tripsCx.dimension(function (d) { return d.startDate; });
var tripsByDateGroup = tripsByDateDimension.group(d3.time.day);
Ниже приведены некоторые методы, которые я использовал, чтобы попытаться применить фильтр:
Это должно использовать 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]);
Я также попытался обойти диаграмму и применить фильтр непосредственно к измерению:
d.dimension().filterFunction(function (d) {
return d.getTime() > start.valueOf() && d.getTime() < end.valueOf()
});
Ничто из того, что я сделал, не приводит к изменению графика.
Я начинаю думать, что у меня неправильное ожидание того, что должна делать функция фильтра?
Как вручную отфильтровать данные в измерении, чтобы обновить диаграмму? Я не хочу использовать кисть. Я буду фильтровать данные, основываясь на разных критериях, я просто пытаюсь сначала разобраться с простым делом.
Я потратил пару дней на это сейчас, и я не знаю, что делать дальше.
Любая помощь будет принята с благодарностью.