2016-11-05 8 views
6

d3に対数スケールを作成する際に問題があります。線形に設定されている場合、スケールは正常に機能します。対数スケールがNaNを返します

これは動作します。しかし

var myLinScale = d3.scale.linear() 
     .domain([0, 100]) 
     .range([50, 1150]); 

console.log(myLinScale(71)); //output = 831 

、これは動作しません:

var myLogScale = d3.scale.log() 
     .domain([0, 100]) 
     .range([50, 1150]); 

console.log(myLogScale(71)); //output = NaN 

は対数スケールの何が問題になっているのですか?

答えて

8
それがゼロを含めるか、交差しないように、あなたのドメインを変更し

上記のデモで

var myLogScale = d3.scale.log() 
 
     .domain([1e-6, 100])//domain doesn't include zero now 
 
     .range([50, 1150]); 
 

 
console.log(myLogScale(71));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

私は0.000001ある1e-6を、使用しています。

説明:

ゼロの対数は未定義(または定義されていない)されています。たとえば、基数10ではlog(0)はxなので、10進数はxになります。その数はゼロです。もちろん、その数は存在しません。しかし、正の側からゼロに近づくと、マイナスの無限大になります。純粋なJavaScriptで

console.log("Log of 0 is: " + Math.log(0))

したがって、JavaScriptで、log(0)は負の無限大、または負の無限大です。 APIによると、言われていること

対数スケールのいずれか排他的に陽性または排他的に負ドメイン有していなければなりません。ドメインはに含まれていてはならず、ゼロを含む必要があります。。 (強調鉱山)

関連する問題