algorithm - 如何从现有的 "step list"定义匹配轴槽口

标签 algorithm math flot discrete-mathematics number-theory

我需要一种方法来对齐两个单独轴上的刻度线,同时能够控制“步长”值(刻度线之间的值),其中两个轴从标记 0 开始并以不同的最大值结束。

为什么会出现这个问题:

Flot,JS 图表包有一个对齐刻度线的选项,但是当我这样做时,我无法控制步长值。然而,我可以直接控制步长值,但随后我就失去了对齐刻度线的能力。不过,我可以恢复定义自己的最大值和步长值,以获得我需要的内容(对齐刻度线,同时保持所需的步长值),但我需要一些帮助。产生这个问题(继续阅读以了解详细信息)。

示例

设a为A轴上的最大值,b为B轴上的最大值。

在此示例中,设 a = 30,b = 82。 假设我想要 6 个刻度线(不计算轴末端的额外刻度线)。事实上,在尝试了几次之后我猜是 6。

一旦我有了所需数量的刻度线,我就可以这样做:

  • 30/6 = 5(我只是选择 A 轴所需的步长值)
  • 现在需要计算 B 轴的刻度对齐
  • 82/6 = 13.67(不是一个好的值,我更喜欢更圆润的东西)
  • 将 B 的最大值移动到 90 ,其中 90/6 = 15 (很好 - 我刚刚获得了 B 轴所需的步长值)

最终结果

输入:

  • a_max = 30,b_max = 82
  • (实际上 a_max 可能是 28.5、29.42,b_max 可能是 84、85.345 等)

输出:

  • a_adjusted_max = 30,b_adjusted_max = 90,
  • a_step = 5,b_step = 15
  • 刻度数= 6(如果计数结束则+1)

视觉:

|---------|---------|---------|---------|---------|---------> A
0         5        10        15        20        25        30

|---------|---------|---------|---------|---------|---------> B
0        15        30        45        60        75        90

“要求”摘要

  • 需要step value每个轴为 1、2、5、10、15、20、25、50、100 之一(示例中 A 为 5,B 为 15)
  • 需要adjusted max value每个轴(示例中 A 为 30,B 为 90)
  • 需要刻度数 match对于两个轴
  • (可选)刻度数是灵活的,但应在 4 到 12 之间作为最佳点
  • 调整后的最大值等于或大于原始最大值,并且位于“四舍五入数字”处(即,如上面的示例所示,90 优于 82)

问题(问题)

  • 我需要消除大部分猜测并自动生成刻度线。
  • 即首先,我需要更好的方法来获取刻度线数量,因为我猜测了上面我想要的刻度线数量,因为我想要一个好的“步长”值,可以是 1, 2 , 5, 10, 15, 20, 25, 50, 100。最大值从 4 开始,最高可达 100。在极少数情况下最高可达 500。大多数情况下,最大值保持在 30-90 之间。<

我该怎么做?

最佳答案

这是我想出的一个程序。我假设您只想要整数。

  • 选择 4 到 12 之间的刻度数
  • 使用此刻度数计算 AB 轴所需的步数
  • 使用这些步长值找出我们必须将轴 A 和轴 B 延伸多少;将这些数字相加并记住结果
  • 从头开始重复下一个刻度值
  • 我们选择给出最低分数的刻度数;如果平局,我们选择较小的刻度数

以下是一些示例结果:

a=30, b=82 给出 4 个刻度

 0    10    20    30
 0    28    56    84

a=8, b=5 给出 6 个刻度

 0     2     4     6     8    10
 0     1     2     3     4     5

这是伪代码:

a = range of A axis
b = range of B axis

tickList[] = {4,5,6,7,8,9,10,11,12}

// calculate the scores for each number of ticks
for i from 0 to length(tickList)-1
    ticks = tickList[i]

    // find the number of steps we would use for this number of ticks
    Astep = ceiling(a/(ticks-1))
    Bstep = ceiling(b/(ticks-1))

    // how much we would need to extend the A axis
    if (a%Astep != 0)
        Aextend[i] = Astep - a%Astep
    else
        Aextend[i] = 0
    end

    // how much we would need to extend the B axis
    if (b%Bstep != 0)
        Bextend[i] = Bstep - b%Bstep
    else
        Bextend[i] = 0
    end

    // the score is the total extending we would need to do
    score[i] = Aextend[i] + Bextend[i]

end


// find the number of ticks that minimizes the score
bestIdx = 0
bestScore = 1000;

for i from 0 to length(tickList);
    if (score[i] < bestScore)
        bestIdx = i
        bestScore = score[i]
    end
end

bestTick = tickList[bestIdx]
bestAstep = ceiling(a/(bestTick-1))
bestBstep = ceiling(b/(bestTick-1))

A 轴从 0bestAstepbestAstep*bestTick

B 轴从 0bestBstepbestBstep*bestTick

关于algorithm - 如何从现有的 "step list"定义匹配轴槽口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28285412/

相关文章:

algorithm - 查找包含按顺序出现频率相同的字母的最长子序列

php - 如何在不到 1 分钟的时间内在 PHP 中计算 0 到 100000000 之间的质数?

javascript - 如何对 jquery fllot 行 1 by 1 进行动画处理

javascript - 使用 Jquery.Flot 或类似工具绘制此图

algorithm - 在一个方向上与原点相交 minkowski 差异,我如何找到相交的脸?

算法 : Majority element

java - 了解 strictMath java 库

python - 欧拉计划 47 查找包含 4 个因子的所有数字

python - 如何在 python 中编写螺旋函数?

jquery - flot.js 图例和网格选项