線性比例
線性比例將連續的、定量的輸入 網域 透過線性轉換(平移和縮放)對應到連續的輸出 範圍。如果範圍也是數字,則對應關係可以 反轉。線性比例是連續定量資料的良好預設選項,因為它們保留了比例差異。每個範圍值 y 可以表示為網域值 x 的函數:y = mx + b。
scaleLinear(domain, range)
範例 · 原始碼 · 建立一個新的線性比例,具有指定的 網域 和 範圍,預設 插值器,並停用 固定。
d3.scaleLinear([0, 100], ["red", "blue"])
如果只指定一個參數,則將其解釋為 範圍。如果 網域 或 範圍 沒有指定,則它們各自預設為 [0, 1]。
d3.scaleLinear(["red", "blue"]) // default domain of [0, 1]
線性(值)
範例 · 原始碼 · 給定 網域 中的值,傳回 範圍 中對應的值。例如,套用位置編碼
const x = d3.scaleLinear([10, 130], [0, 960]);
x(20); // 80
x(50); // 320
套用顏色編碼
const color = d3.scaleLinear([10, 100], ["brown", "steelblue"]);
color(20); // "rgb(154, 52, 57)"
color(50); // "rgb(123, 81, 103)"
如果給定的值超出網域,且未啟用 固定,則會外推對應關係,使得傳回的值超出範圍。
線性.反轉(值)
範例 · 原始碼 · 給定 範圍 中的值,傳回 網域 中對應的值。反轉對於互動很有用,例如用來判斷滑鼠位置對應的資料值。例如,反轉位置編碼
const x = d3.scaleLinear([10, 130], [0, 960]);
x.invert(80); // 20
x.invert(320); // 50
如果給定的值超出範圍,且未啟用 固定,則可能會外推對應關係,使得傳回的值超出網域。此方法僅在範圍為數字時支援。如果範圍不是數字,則傳回 NaN。
對於範圍中有效的y 值,linear(linear.invert(y)) 大約等於 y;類似地,對於網域中有效的x 值,linear.invert(linear(x)) 大約等於 x。由於浮點精度的限制,比例尺及其反函數可能不完全相等。
線性.網域(網域)
範例 · 原始碼 · 如果指定網域,則將比例尺的網域設定為指定的數字陣列,並傳回此比例尺。
const x = d3.scaleLinear().domain([10, 130]);
陣列必須包含兩個或更多元素。如果給定陣列中的元素不是數字,則會強制轉換為數字。
雖然連續比例尺的網域和範圍通常各包含兩個值,但指定超過兩個值會產生分段比例尺。例如,要建立一個 發散顏色比例尺,針對負值在白色和紅色之間插值,針對正值在白色和綠色之間插值,可以這樣寫
const color = d3.scaleLinear([-1, 0, 1], ["red", "white", "green"]);
color(-0.5); // "rgb(255, 128, 128)"
color(+0.5); // "rgb(128, 192, 128)"
在內部,分段比例尺會為對應於給定網域值的範圍內插器執行二元搜尋。因此,網域必須為遞增或遞減順序。如果網域和範圍具有不同的長度N和M,則僅觀察每個網域和範圍中的前min(N,M)個元素。
如果未指定網域,則傳回比例尺目前網域的副本。
color.domain() // [-1, 0, 1]
linear.range(range)
範例 · 原始碼 · 如果指定了範圍,則將比例尺的範圍設定為指定的值陣列,並傳回此比例尺。
const x = d3.scaleLinear().range([0, 960]);
陣列必須包含兩個或更多元素。與網域不同,給定陣列中的元素不必是數字;任何受底層內插器支援的值都可使用,但請注意,反轉需要數值範圍。
如果未指定範圍,則傳回比例尺目前範圍的副本。
x.range() // [0, 960]
請參閱linear.interpolate以取得更多範例。
linear.rangeRound(range)
範例 · 原始碼 · 將比例尺的範圍設定為指定的值陣列,同時將比例尺的內插器設定為interpolateRound;傳回此比例尺。
const x = d3.scaleLinear().rangeRound([0, 960]);
這是一個便利的方法,等同於
linear.range(range).interpolate(d3.interpolateRound)
捨入內插器有時可避免反鋸齒瑕疵,但也可以考慮shape-rendering「crispEdges」樣式。請注意,此內插器只能用於數值範圍。
linear.clamp(clamp)
範例 · 原始碼 · 如果指定了clamp,則根據情況啟用或停用截斷;傳回此比例尺。
const x = d3.scaleLinear([0, 960]).clamp(true);
如果停用截斷,且傳遞給比例尺的值超出網域,則比例尺可能會透過外插傳回超出範圍的值。如果啟用截斷,則比例尺的傳回值始終會在比例尺的範圍內。截斷同樣適用於linear.invert。例如
const x = d3.scaleLinear([10, 130], [0, 960]); // clamping disabled by default
x(-10); // -160, outside range
x.invert(-160); // -10, outside domain
x.clamp(true); // enable clamping
x(-10); // 0, clamped to range
x.invert(-160); // 10, clamped to domain
如果未指定clamp,則傳回比例尺目前是否將值截斷在範圍內。
x.clamp() // true, perhaps
linear.unknown(value)
範例 · 原始碼 · 如果指定了value,則設定比例尺對未定義或 NaN 輸入值的輸出值,並傳回此比例尺。這對於指定如何顯示遺失或無效的資料很有用。
const color = d3.scaleLinear([0, 100], ["red", "blue"]).unknown("#ccc");
color(NaN); // "#ccc"
如果未指定 value,則傳回目前的未知值,預設為未定義。
color.unknown() // "#ccc"
linear.interpolate(interpolate)
範例 · 原始碼 · 如果指定 interpolate,則設定比例的 範圍 插補器工廠。
const color = d3.scaleLinear(["red", "blue"]).interpolate(d3.interpolateHcl);
比例的插補器工廠用於為範圍中每一個相鄰值對建立插補器;這些插補器接著將正規化網域參數 t 從 [0, 1] 對應到範圍中的值。如果未指定 factory,則傳回比例目前的插補器工廠,預設為 d3.interpolate。請參閱 d3-interpolate 以取得更多插補器。
例如,考慮一個範圍中有三種顏色的分歧色彩比例
const color = d3.scaleLinear([-100, 0, +100], ["red", "white", "green"]);
比例內部建立了兩個插補器,等同於
const i0 = d3.interpolate("red", "white");
const i1 = d3.interpolate("white", "green");
指定自訂插補器的常見原因是變更插補的色彩空間。例如,使用 HCL
const color = d3.scaleLinear()
.domain([10, 100])
.range(["brown", "steelblue"])
.interpolate(d3.interpolateHcl);
或使用具有自訂伽瑪值的 Cubehelix
const color = d3.scaleLinear()
.domain([10, 100])
.range(["brown", "steelblue"])
.interpolate(d3.interpolateCubehelix.gamma(3));
警告
預設插補器 可能會重複使用傳回值。例如,如果範圍值是物件,則值插補器會一直傳回同一個物件,並就地修改它。如果比例用於設定屬性或樣式,這通常是可以接受的(且有利於效能);然而,如果您需要儲存比例的傳回值,您必須指定您自己的插補器或適當地複製它。
linear.ticks(count)
範例 · 原始碼 · 從比例的 網域 傳回約 count 個代表性值。
const x = d3.scaleLinear([10, 100], ["red", "blue"]);
x.ticks(); // [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
如果未指定 count,則預設為 10。傳回的刻度值是均勻分佈的,具有可讀性(例如 10 的倍數),且保證在網域範圍內。刻度通常用於顯示參考線或刻度標記,並與視覺化資料結合使用。指定的 count 僅是一個提示;比例可能會傳回更多或更少的值,具體取決於網域。另請參閱 d3-array 的 ticks。
linear.tickFormat(count, specifier)
範例 · 原始碼 · 傳回一個 數字格式 函式,適合用來顯示刻度值,會根據刻度值之間的固定間隔自動計算適當的精度。指定的 count 應與用來產生 刻度值 的計數相同。
const x = d3.scaleLinear([0.1, 1], ["red", "blue"]);
const f = x.tickFormat();
f(0.1); // "0.1"
f(1); // "1.0"
一個可選的 specifier 允許使用 自訂格式,其中格式的精度會由比例尺根據刻度間隔自動設定為適當的精度。例如,若要設定百分比變動的格式,你可以這樣寫
const x = d3.scaleLinear([-1, 1], [0, 960]);
const T = x.ticks(5); // [-1, -0.5, 0, 0.5, 1]
const f = x.tickFormat(5, "+%");
T.map(f); // ["−100%", "−50%", "+0%", "+50%", "+100%"]
如果 specifier 使用格式類型 s
,比例尺會根據網域中的最大值傳回一個 SI-prefix 格式。如果 specifier 已經指定精度,這個方法等於 locale.format。
另請參閱 d3.tickFormat。
linear.nice(count)
範例 · 原始碼 · 延伸 網域,使其從漂亮的整數開始和結束。
const x = d3.scaleLinear([0.241079, 0.969679], [0, 960]).nice();
x.domain(); // [0.2, 1]
這個方法通常會修改比例尺的網域,並且可能只會將範圍延伸到最近的整數。如果網域是從資料計算出來的(例如使用 extent),而且可能不規則,那麼調整網域會很有用。如果網域有超過兩個值,調整網域只會影響第一個和最後一個值。
一個可選的刻度 count 參數允許更精確地控制用來延伸範圍的步長,保證傳回的 刻度 會完全涵蓋網域。
const x = d3.scaleLinear([0.241079, 0.969679], [0, 960]).nice(40);
x.domain(); // [0.24, 0.98]
調整比例尺的網域只會修改目前的網域;它不會自動調整使用 linear.domain 設定的後續網域。如果你需要,必須在設定新的網域後重新調整比例尺的網域。
linear.copy()
const x1 = d3.scaleLinear([0, 100], ["red", "blue"]);
const x2 = x1.copy();
對這個比例尺的變更不會影響傳回的比例尺,反之亦然。
tickFormat(開始, 結束, 計數, 說明)
範例 · 來源 · 傳回一個 數字格式 函式,適合用來顯示刻度值,自動根據刻度值之間的固定間隔計算出適當的精度,由 d3.tickStep 決定。
const f = d3.tickFormat(0, 1, 20);
f(1); // "1.00"
一個可選的 specifier 允許使用 自訂格式,其中格式的精度會由比例尺根據刻度間隔自動設定為適當的精度。例如,若要設定百分比變動的格式,你可以這樣寫
const f = d3.tickFormat(-1, 1, 5, "+%");
f(-0.5); // "-50%"
如果 說明 使用格式類型 s
,則此比例尺會傳回一個 SI 前綴格式,根據 開始 和 結束 的較大絕對值為依據。如果 說明 已經指定精度,則此方法等同於 語言環境.format。
scaleIdentity(範圍)
範例 · 來源 · 建構一個新的恆等比例尺,具有指定的 範圍(以及延伸的 網域)。
const x = d3.scaleIdentity([0, 960]);
恆等比例尺是 線性比例尺 的一種特殊情況,其中網域和範圍相同;因此,比例尺及其反轉方法是恆等函式。這些比例尺偶爾在使用像素座標時很有用,例如與軸線結合使用時。恆等比例尺不支援 rangeRound、clamp 或 interpolate。
如果未指定 範圍,則預設為 [0, 1]。
scaleRadial(網域, 範圍)
範例 · 來源 · 建構一個新的徑向比例尺,具有指定的 網域 和 範圍。
const r = d3.scaleRadial([100, 200], [0, 480]);
徑向比例尺是 線性比例尺 的變體,其中範圍在內部平方,因此輸入值與平方輸出值線性對應。當您希望輸入值對應於圖形標記的面積,且標記由半徑指定(如徑向長條圖)時,這些比例尺很有用。徑向比例尺不支援 插值。
如果未指定 domain 或 range,則每個預設值為 [0, 1]。