为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕侠2389804 2023-03-24 15:07:38
我正在尝试创建一个等高线图,其色标使用对数刻度。scaleLog().domain([1.8e-7, 0.017]);对于大多数域,它会生成 5 - 9 个刻度。但在上面的示例中,它返回了 70 左右。域通常是未知的,所以我不能对它们进行硬编码。两者.nice()似乎都.ticks()对结果没有影响。有没有好的方法来限制刻度数,或者直接设置数字?编辑:我最终通过编写一个递归函数来解决我的问题,该函数减少了 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);
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

不幸的是,你现在看到的...

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会忽略指定的计数 ( source )。

因此,一种可能的解决方案是使用 过滤刻度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>


查看完整回答
反对 回复 2023-03-24
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信