对数刻度偶尔会产生数百个刻度

我正在尝试创建一个等高线图,其色标使用对数刻度。

scaleLog().domain([1.8e-7, 0.017]);

对于大多数域,它会生成 5 - 9 个刻度。但在上面的示例中,它返回了 70 左右。域通常是未知的,所以我不能对它们进行硬编码。

两者.nice()似乎都.ticks()对结果没有影响。有没有好的方法来限制刻度数,或者直接设置数字?

http://img.mukewang.com/641d4c630001eda202990646.jpg

http://img2.mukewang.com/641d4c710001408b04250826.jpg

编辑:我最终通过编写一个递归函数来解决我的问题,该函数减少了 ticks 参数,直到达到我的最大值以下的数字:


 const logScale = scaleFunction().domain([domainMin, domainMax]).nice();


const getThreshholds = (requestedTicks: number) => {

  const tickscale = logScale.ticks(requestedTicks);

  if (tickscale.length <= maxTicks) {

    return tickscale;

  }

  return getThreshholds(requestedTicks - 1);

};


const thresholds = getThreshholds(maxTicks);


慕侠2389804
浏览 89回答 1
1回答

江户川乱折腾

不幸的是,你现在看到的...const s = d3.scaleLog().domain([1.8e-7, 0.017]);console.log(s.ticks())<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>...是预期的结果(重点是我的):对数刻度的特殊之处还在于 scale.ticks会忽略指定的计数 (&nbsp;source&nbsp;)。因此,一种可能的解决方案是使用 过滤刻度scale.tickFormat()。例如,保持 10 个刻度:const s = d3.scaleLog().domain([1.8e-7, 0.017]);const format = s.tickFormat(10);console.log(s.ticks(10).filter(format));<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript