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.