d3.scale.quantize()和d3.scale.quantile()之间有什么区别?

时间:2013-10-08 21:42:12

标签: d3.js

从文档中,定义是:

量化

  

..具有离散而非连续范围的线性标度的变体。输入域仍然是连续的,并根据输出范围(基数)中的值的数量分成统一的段。

位数

  

...将输入域映射到离散范围。虽然输入域是连续的并且比例将接受任何合理的输入值,但输入域被指定为一组离散值。输出范围(基数)中的值的数量决定了将从输入域计算的分位数的数量

这两者似乎都将连续输入域映射到一组离散值。任何人都可以阐明差异吗?

4 个答案:

答案 0 :(得分:21)

一般而言,差异与平均值和中位数之间的差异相似。

当输入域中的值的数量大于输出域中的值的数量时,差异才真正明显。最好用example说明。

对于quantize比例,输入范围根据输出范围分为统一分段。也就是说,域中的值的数量并不重要。因此它返回1为0.2,因为0.2接近1而不是100。

quantile比例基于输入域的分位数,因此受到其中值的数量的影响。输出域中的值的数量仅确定计算的分位数。就其本质而言,分位数反映了实际的值列表而不仅仅是范围。因此,当相应的分位数接近100时,0.2的输入返回100。

答案 1 :(得分:7)

我自己也有同样的问题。所以我做了一个visualization来帮助理解它们是如何工作的。

Understanding d3 scale quantize / quantile

答案 2 :(得分:6)

Coloring Maps有一个很好的视觉解释。

量化:

位数:

  

在散点图上,先前水平的条形图现在是垂直的,因为每个地方的颜色由其等级而非值来确定。

这是D3 v4中的代码片段,显示了量化和分位数的不同结果。

const purples = [
  'purple1',
  'purple2',
  'purple3',
  'purple4',
  'purple5'
]
const dataset = [1, 1, 1, 1, 2, 3, 4, 5] // try [1, 2, 3, 4, 5] as well
const quantize = d3.scaleQuantize()
  .domain(d3.extent(dataset)) // pass the min and max of the dataset
  .range(purples)
const quantile = d3.scaleQuantile()
  .domain(dataset) // pass the entire dataset
  .range(purples)
console.log(quantize(3)) // purples[3]
console.log(quantile(3)) // purples[4]

答案 3 :(得分:5)

据我所知,不同之处在于,统计分位数是有限的,相等的,均匀分布的离散块/桶,您的结果只会落入其中。不同之处在于量化比例是基于离散输入的连续函数。

基本上:量化允许插值和外推,其中分位数强制值进入子集。

因此,例如,如果学生的计算等级在量化量表中为81.7%,则百分位数的分位数量表将简单地说它是第81百分位数。那里没有灵活性的空间。