我正在尝试创建一个等高线图,其色标使用对数刻度。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>
添加回答
举报
0/150
提交
取消