【问题标题】:How does d3.scale.quantile work?d3.scale.quantile 是如何工作的?
【发布时间】:2012-05-14 08:38:25
【问题描述】:

这句话是什么意思?

quantize = d3.scale.quantile().domain([0, 15]).range(d3.range(9));

我看到域是:

0 - 0
1 - 15

范围是从 0 到 8 和 quantize.quantiles

0 - 1.6
1 - 3.3
2 - 4.9
3 - 6.6
4 - 8.3
5 - 9.9
6 -11.6
7 -13.3

quantize.quantiles 的值是如何计算的?我试图打电话给quantize(2),但结果是1。 quantile 是如何工作的?

【问题讨论】:

  • 也许你知道分位数是什么意思以及它是如何工作的?
  • 如果您想更好地了解这些音阶的工作原理,您可以使用我制作的互动式visualization。

标签: d3.js


【解决方案1】:

分位数尺度的动机是获得代表数据集中值的实际分布的类。因此,有必要在构建过程中为其提供完整的值列表。然后,比例尺将输入域(由这些值定义)拆分为区间(分位数),使得每个区间中落入大约相同数量的值。

来自文档:

为了计算分位数,对输入域进行排序,并将其视为一组离散值。

因此,在指定域时,我们将整个值列表提交给比例:

var scale = d3.scale.quantile()
  .domain([1, 1, 2, 3, 2, 3, 16])
  .range(['blue', 'white', 'red']);

如果我们接着运行:

scale.quantiles()

它将输出 [2, 3],这意味着我们的值群被分成三个子集,分别由“蓝色”、“白色”和“红色”表示:

[1, 1] [2, 2] [3, 3, 16]

请注意,当您要显示的数据中存在异常值时,应避免使用此比例。在上面的示例中,16 是落入上分位数的异常值。它被分配了与 3 相同的类,这可能不是所需的行为:

scale(3)   // will output "red"
scale(16)  // will output "red"

【讨论】:

  • 这个答案的介绍段落非常有帮助。应该合并到官方文档 IMO。谢谢。
【解决方案2】:

我建议阅读 quantile scale documentation,尤其是 quantize.quantiles()

但基本上,d3 看到该比例的输出范围内有 9 个值,因此它根据 2 值数据集创建 9 个分位数:[0, 15]。
这导致您在问题中显示的 quantize.quantiles() 值: [1.6, 3.3, .. ,13.3] ,这些代表分位数的范围 - 小于 1.6 的任何值都将映射到输出的第一个元素范围(在这种情况下为零)。小于 3.3 和大于 1.6 的任何值都将映射到输出范围的第二个元素(一)。因此 quantize(2) = 1,正如预期的那样。

【讨论】:

    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多