對數比例尺
對數(“log”)比例尺類似於 線性比例尺,但會在計算輸出範圍值之前,對輸入域值套用對數轉換。對範圍值 y 的對應關係,可以用域值 x 的函數表示:y = m log(x) + b。
注意
由於 log(0) = -∞,對數比例尺的域必須是嚴格正值或嚴格負值;域不能包含或跨越零。具有正域的對數比例尺,對於正值有明確的行為;具有負域的對數比例尺,對於負值有明確的行為。(對於負域,輸入和輸出值會隱含地乘以 -1。)如果您將負值傳遞給具有正域的對數比例尺,反之亦然,則比例尺的行為未定義。
scaleLog(domain, range)
範例 · 原始碼 · 建立一個新的對數比例尺,具有指定的 域 和 範圍、底數 10、預設 內插器,並停用 箝制。
const x = d3.scaleLog([1, 10], [0, 960]);
如果未指定 domain,則預設為 [1, 10]。如果未指定 range,則預設為 [0, 1]。
log.base(base)
範例 · 原始碼 · 如果指定 base,則將此對數比例尺的底數設定為指定的值。
const x = d3.scaleLog([1, 1024], [0, 960]).base(2);
如果未指定 base,則傳回目前的底數,預設為 10。請注意,由於對數轉換的特性,底數不會影響比例尺的編碼;它只會影響所選擇的 刻度。
log.ticks(count)
範例 · 原始碼 · 類似於 linear.ticks,但針對對數比例進行自訂。
const x = d3.scaleLog([1, 100], [0, 960]);
const T = x.ticks(); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
如果 底數 是整數,傳回的刻度會均勻分佈在底數的每個整數次方內;否則,會傳回底數的每個次方一個刻度。傳回的刻度保證會在網域範圍內。如果 網域 中的數量級大於 count,則每個次方最多傳回一個刻度。否則,刻度值不會經過篩選,但請注意,您可以使用 log.tickFormat 來篩選刻度標籤的顯示。如果未指定 count,預設值為 10。
log.tickFormat(count, specifier)
範例 · 原始碼 · 類似於 linear.tickFormat,但針對對數比例進行自訂。指定的 count 通常與用於產生 刻度值 的計數相同。
const x = d3.scaleLog([1, 100], [0, 960]);
const T = x.ticks(); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, …]
const f = x.tickFormat();
T.map(f); // ["1", "2", "3", "4", "5", "", "", "", "", "10", …]
如果刻度太多,格式化程式可能會傳回空字串作為部分刻度標籤;但是,請注意,刻度仍會顯示出來,以準確傳達對數轉換。若要停用篩選,請指定 count 為 Infinity。
在指定計數時,您也可以提供格式 specifier 或格式函式。例如,若要取得會顯示貨幣 20 個刻度的刻度格式化程式,請輸入 log.tickFormat(20, "$,f")
。如果 specifier 沒有定義精度,精度會由比例自動設定,傳回適當的格式。這提供了指定格式的一種便利方式,而精度會由比例自動設定。
log.nice()
範例 · 原始碼 · 類似於 linear.nice,但會將網域延伸至 底數 的整數次方。
const x = d3.scaleLog([0.201479, 0.996679], [0, 960]).nice();
x.domain(); // [0.1, 1]
如果網域有超過兩個值,調整網域只會影響第一個和最後一個值。調整比例只會修改目前的網域;它不會自動調整使用 log.domain 設定的後續網域。如果您需要,必須在設定新的網域後重新調整比例。