如果您擁有的域邊界之一爲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()值,因爲我必須限制刻度的數量,而使用線性刻度更容易。
編輯: 注意 根據你選擇什麼作爲投影它會扭曲你的日誌規模。你使用的更寬的時間間隔將更加拉伸你的比例尺的下半部分。