javascript - 如何确定在图表上绘制 5 的倍数所需的最少 Y 增量数?

标签 javascript math charts

使用 JavaScript,将在图表上绘制一组数字(就我而言,它是 spline chart ):

[12, 22, 25, 38, 47]

spline-1

我希望所有 Y 轴值都是 5 的倍数。我将 Y 轴限制在数组中出现在最高数字之后的 下一个 5 的倍数。由于 47 是最高数字,下一个 5 的倍数是 50(将该值称为“cap”),这是最高值(“tick”)图表的 Y 轴。弄清楚之后,我知道 Y 轴应该是底部的 0,顶部的 50,但我想覆盖默认行为并准确地告诉它中间要显示多少刻度,以及这些刻度的值应该是多少。

这是棘手的地方,因为有以下限制:

  1. 尽可能使用最少的刻度数(0,最大值,中间至少有一个刻度)
  2. 底值始终为零
  3. 所有 Y 刻度值都是 5 的倍数
  4. Y 刻度在轴上均匀分布

对于前面的示例,50 是上限,可以被二整除,因此 Y 轴在底部和顶部之间只需要一个刻度,结果是 三个 标记 0、25、50 的值。我尝试构建的函数将接收 50 作为参数,并输出 3 作为结果。然后我会知道图表需要 3 个刻度,我可以像这样生成它:

spline-2

我的问题是,鉴于图表值可以是 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/

相关文章:

java - 如何告诉 StackedBarChart 的轴的行为?

javascript - Require.js 构建优化配置

javascript - 如何在 JavaScript 中调用 HTML 选择值?

java - 需要一些基本的java帮助

javascript - 分区 N,其中零件的数量和每个零件都是 2 的幂,并且零件大小和数量受到限制

用于具有特定功能的折线图的 JavaScript Canvas 图表库

javascript - 解析Js云代码: how to access object's field

javascript - 我怎样才能将一张图片淡化到另一张之前

c++ - 最大和最小数显示错误

javascript - Highcharts 不通过 Angular Controller 显示图表