2012-07-04 18 views
7

Aktualnie pracuję nad biblioteką d3.js.Mam wykres liniowy z wykorzystaniem Dynamic Line Graph Tutaj mamy opcję rysowania liniowego i logarytmicznego. Ale mój problem polega na tym, że mogę mieć pewne wartości zerowe w moim zbiorze danych, a log 0 jest niezdefiniowany, więc kod nie jest w stanie go narysować. Tutaj w moim kodu skala ustawiony jak tenJak uniknąć logu zerowego na wykresie przy użyciu d3.js

y = d3.scale.log().domain([0.1, max_y _value]).range([h, 0]).nice(); 

i to w jaki sposób jest ona wykorzystywana

lineFunction = d3.svg.line() 
     .y(function(d) { 
      return y(d); 
     }); 

wiem, że jej dziwne question.But czy istnieje sposób, za pomocą którego można obsługiwać protokół Wartość 0, więc jeśli mam jedną wartość zerową, pozostałe są poprawnie naniesione. Czy mogę podać dwie domeny i zakres w tym samym wyciągu (aby obsłużyć wartość 0), jeśli tak, to w jaki sposób będzie wiązać się z osią y?

Dzięki, każda pomoc zostanie doceniona.

Odpowiedz

12

Rozwiązałem mój problem, używając funkcji clamp. W ten sposób mam zmieniony kod:

y = d3.scale.log().clamp(true).domain([0.1, max_y _value]).range([h, 0]).nice(); 
2

Jeśli masz domenę, która ma jedną z granic domen jak skali 0 dziennika nie będzie pracować dla Ciebie. Również skala logarytmiczna zapewnia funkcję tick() z nieosiągalną liczbą znaczników.

Moje bieżące zadanie polega na wyświetlaniu danych z dowolnymi domenami i zakresami na liniowej wykresie scaledingu skalowanego, ALE opcjonalnie użytkownik może przejść na skalę logarytmiczną. Obejmuje to problematyczne domeny [0, n] i [n, 0].

Oto rozwiązanie, które opracowałem, aby poradzić sobie z takimi przypadkami: Można uniknąć tego problemu, jeśli używamy skali liniowej do projekcji naszej domeny do dowolnego zakresu z dodatnimi granicami. Wybieram [1,10], ale może przyjmować dowolne liczby dodatnie. Następnie możemy użyć normalnej skali logarytmicznej.

d3.scale.genericLog = function() { 
    return GenericLog(); 
}; 
function GenericLog() { 
    var PROJECTION=[1,10]; 
    var linearScale, logScale; 

    linearScale=d3.scale.linear(); 
    linearScale.range(PROJECTION); 

    logScale=d3.scale.log(); 
    logScale.domain(PROJECTION); 

    function scale(x) { 
     return logScale(linearScale(x)); 
    } 
    scale.domain = function(x) { 
     if (!arguments.length) return linearScale.domain(); 
     linearScale.domain(x); 
     return scale; 
    }; 
    scale.range = function(x) { 
     if (!arguments.length) return logScale.range(); 
     logScale.range(x); 
     return scale; 
    }; 
    scale.ticks = function(m) { 
     return linearScale.ticks(m); 
    }; 
    return scale; 

} 

Zastosowanie:

var scale1 = d3.scale.genericLog().domain([0,1]).range([500,1000]); 
var scale2 = d3.scale.genericLog().domain([-10,0]).range([500,1000]); 
scale1(0) //500 
scale2(-10) //500 
scale2(0) //100 

Potrzebowałem tylko zakres, skalę()(), kleszcze() działa więc tylko te zawarte, ale nie powinno trwać dłużej niż 5 minut, aby realizować wszystkie inni. Ponadto: zauważ, że używałem wartości ticks() skali liniowej, ponieważ musiałem ograniczyć liczbę znaczników i to jest łatwiejsze w skali liniowej.

EDIT: PAMIĘTAJ W zależności od tego, co wybrać jako projekcja zostanie ona zakłócać swoją skali logarytmicznej. Szerszy interwał, którego użyjesz, zwiększy twoją dolną część skali.

Powiązane problemy