scaleQuantile函数没有输出我期望的结果

时间:2017-10-19 21:37:57

标签: javascript d3.js

我使用d3.scaleQuantile()获取一些特定的数字输出,d3.scaleQuantile()的范围是一个包含8个数字的数组。我console.log()在范围的中间位置的数字,它返回该范围的第一个。代码看起来像这样

var sortMass = d3.scaleQuantile()
    .domain([minMass, maxMass])
    .range([2000,4000,6000,8000,100000,120000])
console.log(sortMass(6500)) // here shows 2000

如果它返回6000或8000,那就更有意义了。但我无法弄清楚为什么输出是2000.我读过D3文档,但我仍然感到困惑。任何人都可以解释d3.scaleQuantile()函数的工作原理吗?

1 个答案:

答案 0 :(得分:1)

这里有一个误解:在D3等级中,任何比例尺,你都不会将范围内的值传递给比例尺。而不是那样,你在中传递一个值。

所以,鉴于你的规模......

var sortMass = d3.scaleQuantile()
  .domain([minMass, maxMass])
  .range([2000, 4000, 6000, 8000, 100000, 120000]);

...如果您在minMass和maxMass 之间传递一个值,它将返回该范围内的对应值。

这是一个基本演示,我将minMass设置为0,将maxMass设置为100



var minMass = 0,
  maxMass = 100;
var sortMass = d3.scaleQuantile()
  .domain([minMass, maxMass])
  .range([2000, 4000, 6000, 8000, 100000, 120000]);

d3.range(0, 110, 10).forEach(function(d) {
  console.log("for the value " + d + ", the output is:" + sortMass(d))
})

<script src="https://d3js.org/d3.v4.min.js"></script>
&#13;
&#13;
&#13;

我怀疑您使用范围限制为minMassmaxMass。如果确实如此,那么它就不会起作用:域名分为相等段。让我们证明一下:

&#13;
&#13;
var sortMass = d3.scaleQuantile()
  .domain([2000,120000])
  .range([2000, 4000, 6000, 8000, 100000, 120000]);

console.log(sortMass(6500))
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
&#13;
&#13;
&#13;

输出中的2000是合适的预期。

因此,如果我的上述假设是正确的,您应该使用阈值比例:

&#13;
&#13;
var thresholds = [2000, 4000, 6000, 8000, 100000, 120000];
var sortMass = d3.scaleThreshold()
  .domain(thresholds)
  .range(thresholds);

console.log(sortMass(6500))
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
&#13;
&#13;
&#13;

<强>结论:

所以,回答你的问题:

  

任何人都可以解释d3.scaleQuantile()函数的工作原理吗?

对于任何D3比例,您都会根据传递一个值,比例将根据范围返回一个值。记住:

  • →是输入。
  • 范围→是输出。