2012-07-04 35 views
7

Tôi hiện đang làm việc trên thư viện d3.js.I có biểu đồ dạng đường bằng cách sử dụng Dynamic Line Graph Ở đây chúng tôi có tùy chọn vẽ tuyến tính và nhật ký. Nhưng vấn đề của tôi là tôi có thể có một số giá trị 0 trong tập dữ liệu của mình và vì log 0 không xác định nên mã không thể vẽ nó. đây trong mã của tôi quy mô thiết lập như thế nàyLàm thế nào để tránh số không log trong đồ thị bằng cách sử dụng d3.js

y = d3.scale.log().domain([0.1, max_y _value]).range([h, 0]).nice(); 

và đây là cách nó được sử dụng

lineFunction = d3.svg.line() 
     .y(function(d) { 
      return y(d); 
     }); 

Tôi biết rằng một question.But lẻ của nó là có một cách nào để tôi có thể xử lý đăng nhập 0 giá trị để nếu tôi có giá trị bằng không, phần còn lại của chúng được vẽ chính xác. Tôi có thể cho hai tên miền và phạm vi trong cùng một câu lệnh (để xử lý giá trị 0) nếu có hơn cách nó sẽ liên kết với trục y?

Cảm ơn mọi trợ giúp sẽ được đánh giá cao.

Trả lời

12

Tôi đã giải quyết được sự cố của mình bằng cách sử dụng hàm clamp. Đây là cách tôi đã thay đổi mã:

y = d3.scale.log().clamp(true).domain([0.1, max_y _value]).range([h, 0]).nice(); 
2

Nếu bạn có miền có giới hạn miền là 0 log scale sẽ không hoạt động. Thang đo log cũng cung cấp cho bạn một hàm tick() với số lượng bọ ve không thể xác định được.

Nhiệm vụ hiện tại của tôi là hiển thị dữ liệu với các miền tùy ý và phạm vi trên biểu đồ phân tán tỷ lệ tuyến tính BUT tùy chọn người dùng có thể thay đổi theo thang đo logarit. Điều này bao gồm các miền có vấn đề [0, n] và [n, 0].

Đây là giải pháp tôi đưa ra để xử lý các trường hợp sau: Vấn đề có thể tránh được nếu chúng tôi đang sử dụng thang đo tuyến tính để đưa miền của chúng tôi đến phạm vi tùy ý với ranh giới tích cực. Tôi chọn [1,10] nhưng nó có thể lấy bất kỳ số dương nào. Sau đó, chúng ta có thể sử dụng thang log thông thường.

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; 

} 

Cách sử dụng:

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 

tôi chỉ cần khoảng(), quy mô(), bọ ve() chức năng vì vậy tôi chỉ bao gồm những nhưng nó không nên mất hơn 5 phút để thực hiện tất cả những người khác. Ngoài ra: lưu ý rằng tôi đã sử dụng các giá trị tick() của thang tỷ lệ tuyến tính vì tôi phải giới hạn số lượng ve và dễ dàng hơn với thang đo tuyến tính.

EDIT: ĐƯỢC AWARE Tùy thuộc vào những gì bạn chọn làm DỰ BÁO, nó sẽ bóp méo quy mô nhật ký của bạn. Khoảng thời gian rộng hơn bạn sử dụng sẽ strecth phần dưới của quy mô của bạn nhiều hơn nữa.

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