2016-11-05 3 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>

В вышеприведенном демо я использую 1e-6, который 0.000001.

Пояснение:

Логарифм нуля не определен (или не определено). В базе 10, например, log (0) представляет собой число x, так что 10, поднятый до мощности x, равен нулю ... этого числа, конечно, не существует. Предел, однако, когда мы приближаемся к нулю с положительной стороны, составляет минус бесконечность.

В чистом JavaScript:

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

Таким образом, в JavaScript, log(0) является отрицательная бесконечность или минус бесконечность.

Это, как говорится, по API:

логарифмическая шкала должна иметь либо исключительно-положительный или исключительно-отрицательный домен; домен не должен включать или пересекать ноль. (выделено мной)

Смежные вопросы