Se si dispone di un dominio che ha uno dei confini del dominio come scala 0 registro non funzionerà per voi. Anche la scala di registro fornisce una funzione tick() con un numero di tick non modificabile.
Il mio attuale compito è quello di visualizzare dati con domini arbitrari e intervalli su una tabella di dispersione in scala lineare, ma facoltativamente l'utente può passare alla scala logaritmica. Ciò include i domini problematici [0, n] e [n, 0].
Ecco una soluzione che mi è venuta in mente per gestire questi casi: Il problema può essere evitato se si utilizza una scala lineare per proiettare il nostro dominio su un intervallo arbitrario con limiti positivi. Scelgo [1,10] ma può prendere qualsiasi numero positivo. Dopo di ciò possiamo usare una scala di registro normale.
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;
}
Usage:
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
mi serviva solo la gamma(), scala(), zecche() funzioni in modo ho incluso solo questi, ma non dovrebbe prendere più di 5 minuti di attuare tutte gli altri. Inoltre: nota che stavo usando i valori ticks() della scala lineare perché dovevo limitare il numero di tick e questo è più facile con la scala lineare.
EDIT: essere consapevoli A seconda di ciò che si sceglie come PROIEZIONE sarà distorcere la vostra scala logaritmica. L'intervallo più ampio che usi stria più la parte inferiore della tua scala.