跳至内容

序数刻度

连续刻度 不同,序数刻度具有离散的域和值域。例如,序数刻度可以将一组命名类别映射到一组颜色,或者确定柱状图中各列的水平位置。

scaleOrdinal(domain, range)

示例 · 源代码 · 使用指定的 值域 创建一个新的序数刻度。

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

如果未指定 ,则默认为空数组。如果未指定 值域,则默认为空数组;序数刻度始终返回 undefined,直到定义非空值域。

ordinal(value)

示例 · 源代码 · 给定输入 中的 ,返回输出 值域 中的对应值。

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

如果给定的 不在刻度的 中,则返回 未知值;或者,如果未知值是 隐式 的(默认值),则将 隐式地添加到域中,并将值域中下一个可用的值分配给 ,以便此调用和随后对该刻度使用相同输入 的调用返回相同输出值。

ordinal.domain(domain)

示例 · 源代码 · 如果指定了 ,则将域设置为指定的值数组。

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"]

注意

建议使用显式域来实现确定性行为;从使用中推断域取决于排序。

ordinal.range(range)

示例 · 源代码 · 如果指定了 值域,则将序数刻度的值域设置为指定的值数组。

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

域中的第一个元素将映射到 值域 中的第一个元素,第二个域值映射到第二个值域值,依此类推。如果 值域 中的元素少于域中的元素,则刻度将从 值域 的开头重用值。如果未指定 值域,则此方法返回当前值域。

ordinal.unknown(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

如果未指定 ,则返回当前未知值,默认值为 隐式。隐式值启用隐式域构造;请参见 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

注意

建议使用显式域来实现确定性行为;从使用中推断域取决于排序。