2016-11-05 13 views
6

Tôi gặp vấn đề khi tạo thang loga trong d3. Quy mô hoạt động tốt nếu được đặt thành tuyến tính.Quy mô logarit trả về NaN

này hoạt động:

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

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

Tuy nhiên, điều này không làm việc:

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

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

Điều gì là sai với quy mô logarit?

Trả lời

8

Thay đổi tên miền của bạn để nó không bao gồm hoặc qua zero:

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>

Trong bản demo trên Tôi đang sử dụng 1e-6, đó là 0.000001.

Giải thích:

Lôgarit của zero là undefined (hoặc chưa xác định). Trong cơ sở 10, ví dụ, log (0) là một số x để 10 tăng lên đến sức mạnh của x là số không ... con số đó, tất nhiên, không tồn tại. Giới hạn, tuy nhiên, khi chúng tôi tiếp cận số không từ phía dương là trừ vô cùng.

Trong tinh khiết JavaScript:

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

Như vậy, trong JavaScript, log(0) là vô cực tiêu cực, hoặc trừ vô cùng.

Điều đó đang được nói, theo API:

thang logarit phải có hoặc là một miền riêng dương hoặc độc quyền âm; tên miền không được bao gồm hoặc chéo số. (nhấn mạnh mỏ)

Các vấn đề liên quan