跳至內容

序數比例尺

連續比例尺 不同,序數比例尺具有離散的定義域和值域。例如,序數比例尺可以將一組命名類別對應到一組顏色,或決定直方圖中直條的水平位置。

scaleOrdinal(domain, range)

範例 · 原始碼 · 建立一個新的序數比例尺,具有指定的 domainrange

js
const color = d3.scaleOrdinal(["a", "b", "c"], ["red", "green", "blue"]);

如果未指定 domain,它預設為空陣列。如果未指定 range,它預設為空陣列;序數比例尺在定義非空值域之前,總是會傳回未定義。

序數()

範例 · 原始碼 · 給定輸入 網域 中的,傳回輸出 範圍 中對應的值。

js
color("a") // "red"

如果給定的不在比例尺的 網域 中,傳回 未知值;或者,如果未知值是 隱含的(預設),則會隱含地新增到網域中,且範圍中下一個可用的值會指派給,如此一來,給定相同輸入的此呼叫和後續呼叫會傳回相同的輸出值。

序數.網域(網域)

範例 · 原始碼 · 如果指定網域,則將網域設定為指定的值陣列。

js
const color = d3.scaleOrdinal(["red", "green", "blue"]).domain(["a", "b", "c"]);
color("a"); // "red"
color("b"); // "green"
color("c"); // "blue"

網域 中的第一個元素會對應到範圍中的第一個元素,第二個網域值對應到第二個範圍值,以此類推。網域值會儲存在從基本值到索引的 InternMap 中;然後會使用產生的索引從範圍中擷取一個值。因此,序數比例尺的值必須可以強制轉換為基本值,且基本網域值會唯一識別對應的範圍值。

js
color.domain() // ["a", "b", "c"]

如果未指定網域,此方法會傳回目前的網域。

如果 未知值隱含的(預設),則在序數比例尺上設定網域是可選的。在這種情況下,網域會從使用情況中隱含地推論出來,方法是將傳遞給比例尺的每個唯一值指派一個新的範圍值。

js
const color = d3.scaleOrdinal(["red", "green", "blue"]);
color("b"); // "red"
color("a"); // "green"
color("c"); // "blue"
color.domain(); // inferred ["b", "a", "c"]

注意

建議使用明確的網域以獲得確定性的行為;從使用情況中推論網域會依賴於排序。

序數.範圍(範圍)

範例 · 原始碼 · 如果指定範圍,則將序數比例尺的範圍設定為指定的值陣列。

js
const color = d3.scaleOrdinal().range(["red", "green", "blue"]);

網域中的第一個元素會對應到範圍中的第一個元素,第二個網域值對應到第二個範圍值,以此類推。如果範圍中的元素少於網域中的元素,比例尺會重複使用範圍開頭的值。如果未指定範圍,此方法會傳回目前的範圍。

序數.未知()

範例 · 原始碼 · 如果指定 value,則設定未知輸入值的比例輸出值,並傳回此比例。

js
const color = d3.scaleOrdinal(["a", "b", "c"], d3.schemeTableau10).unknown(null);
color("a"); // "#4e79a7"
color("b"); // "#f28e2c"
color("c"); // "#e15759"
color("d"); // null

如果未指定 value,則傳回目前的未知值,預設為 隱含。隱含值可啟用隱含網域建構;請參閱 ordinal.domain

ordinal.copy()

範例 · 原始碼 · 傳回此序數比例的精確副本。

js
const c1 = d3.scaleOrdinal(["a", "b", "c"], d3.schemeTableau10);
const c2 = c1.copy();

對此比例的變更不會影響傳回的比例,反之亦然。

scaleImplicit

範例 · 原始碼 · ordinal.unknown 的特殊值,可啟用隱含網域建構:未知值會隱含加入網域。

js
const color = d3.scaleOrdinal(["a", "b", "c"], d3.schemeTableau10);
color.unknown(); // d3.scaleImplicit

注意

建議使用明確的網域以獲得確定性的行為;從使用情況中推論網域會依賴於排序。