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

jks*_*der 19 d3.js

从文档中,定义是:

量化

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

位数

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

这两者似乎都将连续输入域映射到一组离散值.任何人都能说明这种差异吗?

Lar*_*off 21

一般而言,差异类似于均值和中位数之间的差异.

只有当输入域中的值的数量大于输出域中的值的数量时,差异才会明显.最好的例子说明.

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

quantile尺度是根据所述输入域的位数,因此受值的出现次数.输出域中的值的数量仅确定计算的分位数.就其本质而言,分位数反映了实际的值列表而不仅仅是范围.因此,当相应的分位数接近100时,0.2的输入返回100.


Dav*_*ave 7

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

了解d3比例量化/分位数


Nob*_*obu 7

着色地图有一个很好的视觉解释.

量化:

位数:

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

这是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]
Run Code Online (Sandbox Code Playgroud)


DRo*_*son 5

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

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

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