对数刻度
对数 (“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")
。如果规范没有定义精度,则精度将由刻度自动设置,返回适当的格式。这提供了一种方便的方法来指定格式,其精度将由刻度自动设置。
log.nice()
示例 · 源代码 · 类似于 linear.nice,但将域扩展到 基数 的整次幂。
const x = d3.scaleLog([0.201479, 0.996679], [0, 960]).nice();
x.domain(); // [0.1, 1]
如果域具有两个以上的数值,则美化域只会影响第一个和最后一个数值。美化刻度只会修改当前域;它不会自动美化随后使用 log.domain 设置的域。如果需要,您必须在设置新域后重新美化刻度。