2013-07-16 18 views
6

jsFiddle: http://jsfiddle.net/PYeFP/Dodanie filtru dc.js/Crossfilter nie aktualizowanie wykresu

Mam wykres słupkowy ustanowiony że wykresy liczby użytkowników przejazdów przez dzień

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

wyświetlaczach wykres dobrze, ale chciałbym go filtrować za pomocą niektórych kontrolek jQuery. Gdy użytkownik wybierze datę Próbuję dodać filtr do wykresu, filtr zostanie dodany, ale wykres się nie zmieni, nawet jeśli I redraw() lub render().

ten sposób crossfilter jest konfiguracja:

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

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

Oto niektóre z metod użyłem, aby spróbować zastosować filtr:

Należy użyć 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]); 

Próbowałem też z pominięciem wykresu i zastosowaniu filtra bezpośrednio na wymiar:

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

Nic nie zrobiłem powoduje, że wykres, aby zmienić.

Zaczynam myśleć, że mam złe oczekiwania co do funkcji filtrującej?

Jak mogę ręcznie filtrować dane w wymiarze, aby zaktualizować wykres? Nie chcę używać pędzla. Będę filtrowanie danych w oparciu o różne kryteria, po prostu staram się najpierw sprawą prosty.

Spędziłem teraz kilka dni na tym i nie mam pojęcia, co dalej.

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

8

Próbowałeś zresetować swoje x właściwość wykresu po ustawieniu filtra crossfilter

Mam nieco podobny przypadek i co robię po każdej akcji, która zmienia przefiltrowane wartości jest coś wzdłuż linii

.x (..). Wymiar (...). Grupa (...)

po utworzeniu/ustawiania filtrów

próbował zrobić coś takiego

$('#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/

lepszą odpowiedź na dyskusji w komentarzu jest dodanie filtra do wymiaru, nie wykres

Wreszcie, należy zrealizować to, co jest wymienione w

Uwaga: grupa przecina filtry bieżące filtru krzyżowego, z wyjątkiem skojarzonego filtra wymiaru. Dlatego metody grupowe uwzględniają tylko rekordy, które spełniają wszystkie filtry oprócz tego filtru tego wymiaru. Tak więc, jeśli filtr przekierowań płatności jest filtrowany według typu i sumy, grupa po klasie obserwuje tylko filtr według typu.

(patrz również https://groups.google.com/d/msg/dc-js-user-group/UFxvUND7hmY/btbAjqIIzl8J)

+0

Dzięki, wypowiedziało się w wierszu, w którym stosuje się filtr w zaktualizowanym jsfiddle i wykresu jeszcze zmienić. Zmiana skali osi X wydaje się działać na wykresie słupkowym, ale nie sądzę, że filtruje podstawowe dane. Pytam szczególnie o filtry, ponieważ chcę, aby działały z wszystkimi wykresami DC. Kolejny problem z osią x polega na tym, że nie mogę wykonywać bardziej skomplikowanych filtrów, takich jak funkcja filterFunction. Dzięki za odpowiedź. – DannyLane

+1

Widzę, o co ci chodzi. Pozwól mi spróbować jeszcze raz :). Dodanie filtru do wymiaru, a nie do wykresu, wydaje się mieć znaczenie. Czy http://jsfiddle.net/PYeFP/8/ pracuje dla Ciebie? – Peter

+0

Jest to trochę pomocne, ponieważ widzę, że filtr jest możliwy aktualizacji wykresu. Problem polega na tym, że istnieje dodatkowy wymiar, który nie odpowiada, dlaczego nie mogę filtrować na moim obiekcie startDate. Zaktualizowałem skrzypce za pomocą funkcji filtrowania, w dziennikach widać, że liczba elementów wynosi od 13 do 9, ale wykres nie aktualizuje się. http://jsfiddle.net/PYeFP/9/ – DannyLane

Powiązane problemy