2012-07-04 29 views
7

我當前工作的圖書館d3.js.I有使用 Dynamic Line Graph 我們這裏有圖紙功率線性和日誌的選項線圖。 但我的問題是,我的數據集中可能有一些值爲零,因爲日誌0未定義,所以代碼無法繪製它。 這裏在我的代碼規模設置這樣如何避免在圖形登錄使用零d3.js

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

,這是它是如何使用

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

我知道它的奇數question.But是由有我可以處理日誌的方式0值,這樣如果我有單個零值,其餘部分繪製正確。 如果是,我可以在同一語句中給出兩個域和範圍(處理0值),而不是如何綁定到y軸?

謝謝任何​​幫助,將不勝感激。

回答

12

我使用clamp函數解決了我的問題。這就是我如何更改代碼:

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

如果您擁有的域邊界之一爲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 

我只需要範圍(),規模(),蜱()函數,所以我只包括這些,但它不應該超過5分鐘,以實現所有其他。此外:請注意,我使用線性刻度的ticks()值,因爲我必須限制刻度的數量,而使用線性刻度更容易。

編輯: 注意 根據你選擇什麼作爲投影它會扭曲你的日誌規模。你使用的更寬的時間間隔將更加拉伸你的比例尺的下半部分。