ドメイン境界の1つが0の対数スケールであるドメインがある場合は、機能しません。また、対数目盛は、目立たない数の目盛りを持つtick()関数を提供します。
私の現在の割り当ては、線形スケールの散布図に任意のドメインと範囲のデータを表示することですが、オプションで、ユーザーは対数スケールに切り替えることができます。これには、問題のある[0、n]および[n、0]ドメインが含まれます。
これらのケースを処理するために私が思いついた解決策は次のとおりです。線形スケールを使用してドメインを正の境界を持つ任意の範囲に投影する場合、この問題を回避できます。[1,10]を選択しますが、任意の正の数を取ることができます。その後、通常の対数スケールを使用できます。
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;
}
使用法:
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
range()、scale()、ticks()関数だけが必要だったので、これらだけを含めましたが、他のすべてを実装するのに5分以上かかることはありません。また、ティック数を制限する必要があったため、線形スケールのticks()値を使用していたことに注意してください。これは、線形スケールの方が簡単です。
編集:
注意
してください投影として選択するものによっては、対数スケールが歪むことになります。使用する間隔を広くすると、スケールの下部がより強くなります。