使用 JavaScript,将在图表上绘制一组数字(就我而言,它是 spline chart ):
[12, 22, 25, 38, 47]
我希望所有 Y 轴值都是 5 的倍数。我将 Y 轴限制在数组中出现在最高数字之后的 下一个 5 的倍数。由于 47
是最高数字,下一个 5 的倍数是 50
(将该值称为“cap”),这是最高值(“tick”)图表的 Y 轴。弄清楚之后,我知道 Y 轴应该是底部的 0
,顶部的 50
,但我想覆盖默认行为并准确地告诉它中间要显示多少刻度,以及这些刻度的值应该是多少。
这是棘手的地方,因为有以下限制:
- 尽可能使用最少的刻度数(0,最大值,中间至少有一个刻度)
- 底值始终为零
- 所有 Y 刻度值都是 5 的倍数
- Y 刻度在轴上均匀分布
对于前面的示例,50 是上限,可以被二整除,因此 Y 轴在底部和顶部之间只需要一个刻度,结果是 三个 标记 0、25、50
的值。我尝试构建的函数将接收 50
作为参数,并输出 3
作为结果。然后我会知道图表需要 3 个刻度,我可以像这样生成它:
我的问题是,鉴于图表值可以是 5 的任意倍数,我如何计算 Y 轴上所需的最少刻度数,仅使用倍数增量5?最简单的方法可能是仅显示前几个场景来说明该模式(至少对我而言)并不明显:
value = tick1, tick2, tick3, etc. >> return count of ticks
05 = 5, 4, 3, 2, 1, 0 >> return 6;// This case is an outlier and can be set manually
10 = 10, 5, 0 >> return 3;
15 = 15, 10, 5, 0 >> return 4;
20 = 20, 10, 0 >> return 3;
25 = 25, 20, 15, 10, 5, 0 >> return 6;
30 = 30, 15, 0 >> return 3;
35 = 35, 30, 25, 20, 15, 10, 5, 0 >> return 8;
40 = 40, 20, 0 >> return 3;
45 = 45, 30, 15, 0 >> return 4;
50 = 50, 25, 0 >> return 3;
55 = 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5, 0 >> return 12;
正是在这一点上,我意识到可能存在一个方程式或函数来解决这个难题,甚至可能与斐波那契数列或丹布朗有关。我找不到任何相关的 SO 问题,我对“5 的增量”的使用可能会使这个用例过于具体,无法根据一般原则返回谷歌结果,因此欢迎任何建议。
最佳答案
您可以采用迭代方法,使用值的五分之一检查除以 2、3、5、7 等的能力,然后返回该值递增 1。
const
fn = v => {
v /= 5;
if (v === 1) return 6;
if (v % 2 === 0) return 3;
var i = 1;
while ((i += 2) < v) if (v % i === 0) return i + 1;
return v + 1;
},
format = s => s.toString().padStart(2);
var values = Array.from({ length: 12 }, (_, i) => (i + 1) * 5),
data = values.map(fn);
console.log(...values.map(format));
console.log(...data.map(format));
关于javascript - 如何确定在图表上绘制 5 的倍数所需的最少 Y 增量数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58057659/