跳至内容

数据分箱

将定量值划分为连续的、不重叠的区间,如直方图。(另请参见 Observable Plot 的 bin 变换。)

bin()

js
const bin = d3.bin().value((d) => d.culmen_length_mm);

示例 · 源代码 · 使用默认设置构建一个新的分箱生成器。返回的分箱生成器支持方法链,因此此构造函数通常与 bin.value 链起来以分配值访问器。返回的生成器也是一个函数;向它传递数据 以进行分箱。

bin(data)

js
const bins = d3.bin().value((d) => d.culmen_length_mm)(penguins);

将给定的data样本的迭代器进行分箱。返回一个分箱数组,其中每个分箱都是一个包含输入data中相关元素的数组。因此,分箱的length 是该分箱中元素的数量。每个分箱都有两个额外的属性

  • x0 - 分箱的下界(包含)。
  • x1 - 分箱的上界(不包含,最后一个分箱除外)。

给定的data 中的任何空值或不可比较的值,或那些超出 的值,都会被忽略。

bin.value(value)

js
const bin = d3.bin().value((d) => d.culmen_length_mm);

如果指定了value,则将值访问器设置为指定的函数或常量,并返回此分箱生成器。

js
bin.value() // (d) => d.culmen_length_mm

如果未指定value,则返回当前值访问器,默认值为恒等函数。

当分箱 生成 时,值访问器将针对输入数据数组中的每个元素调用,传递元素d、索引i和数组data作为三个参数。默认值访问器假定输入数据是可排序的(可比较的),例如数字或日期。如果您的数据不可排序,则您应该指定一个访问器,该访问器为给定数据返回相应的可排序值。

这类似于在调用分箱生成器之前将您的数据映射到值,但它具有以下优点:输入数据仍然与返回的分箱相关联,从而更轻松地访问数据的其他字段。

bin.domain(domain)

js
const bin = d3.bin().domain([0, 1]);

如果指定了domain,则将域访问器设置为指定的函数或数组,并返回此分箱生成器。

js
bin.domain() // [0, 1]

如果未指定domain,则返回当前域访问器,默认值为 extent。分箱域定义为一个数组 [min, max],其中min 是最小可观察值,max 是最大可观察值;这两个值都包含在内。当分箱 生成 时,域之外的任何值都会被忽略。

例如,要使用 线性刻度 x 的分箱生成器,您可以这样说

js
const bin = d3.bin().domain(x.domain()).thresholds(x.ticks(20));

然后,您可以从数字数组中计算分箱,如下所示

js
const bins = bin(numbers);

如果使用默认的 extent 域,并且 阈值 指定为计数(而不是显式值),则计算的域将被 美化,以使所有分箱的宽度一致。

请注意,域访问器在物化的 数组上调用,而不是在输入数据数组上调用。

bin.thresholds(thresholds)

js
const bin = d3.bin().thresholds(20);

如果thresholds 指定为一个数字,则 将被均匀地划分为大约这么多分箱;参见 刻度

js
const bin = d3.bin().thresholds([0.25, 0.5, 0.75]);

如果thresholds 指定为一个数组,则将阈值设置为指定的值,并返回此分箱生成器。阈值定义为一个值数组 [x0, x1, …]。任何小于x0 的值都将被放入第一个分箱;任何大于或等于x0 但小于x1 的值都将被放入第二个分箱;依此类推。因此,生成的分箱 将有thresholds.length + 1 个分箱。任何超出 的阈值都会被忽略。第一个bin.x0 始终等于最小域值,最后一个bin.x1 始终等于最大域值。

js
const bin = d3.bin().thresholds((values) => [d3.median(values)]);

如果thresholds 指定为一个函数,则该函数将传递三个参数:从数据中导出的输入 数组,以及表示为minmax。然后,该函数可以返回数字阈值数组或分箱数;在后一种情况下,域将被均匀地划分为大约count 个分箱;参见 刻度。例如,您可能希望在对时间序列数据进行分箱时使用时间刻度;参见 示例

js
bin.thresholds() // () => [0, 0.5, 1]

如果未指定thresholds,则返回当前阈值生成器,默认情况下,它实现 Sturges 公式。(因此,默认情况下,要分箱的值必须是数字!)

thresholdFreedmanDiaconis(values, min, max)

js
const bin = d3.bin().thresholds(d3.thresholdFreedmanDiaconis);

源代码 · 根据 Freedman–Diaconis 规则 返回分箱数;输入values 必须是数字。

thresholdScott(values, min, max)

js
const bin = d3.bin().thresholds(d3.thresholdScott);

源代码 · 根据 Scott 的正态参考规则 返回分箱数;输入values 必须是数字。

thresholdSturges(values, min, max)

js
const bin = d3.bin().thresholds(d3.thresholdSturges);

源代码 · 根据 Sturges 公式 返回分箱数;输入values 必须是数字。