确定Y轴标签和位置的算法?

时间:2011-06-08 20:57:31

标签: algorithm language-agnostic charts

给定一组y值,如[-3400, -1000, 500, 1200, 3790],如何确定“好的”Y轴标签并将它们放在网格上?

           ^
---(6,000)-|---
           |
---(4,000)-|---
           |
---(2,000)-|---
           |
<------(0)-+---------------------------------------->
           |
--(-2,000)-|---
           |
--(-4,000)-|---
           V

1 个答案:

答案 0 :(得分:4)

您可以按以下方式执行此操作:

  1. 计算出您想要的标签数量(n)。结果可能没有这么多标签,但它会很接近。我将要n = 6
  2. 决定,你认为“漂亮”的数字是多少。你只想看到像1,2,5,10,20,50 ......这样的步骤(在这种情况下,漂亮的数字是1,2和5)或者是1,2,4,5,6,8这样的步骤,10,......还好吗?我将只考虑1,2和5。
  3. 找出序列的最小值(min)和最大值(max),其余数字无关紧要。 (min = -3400max = 3790
  4. 计算标签之间理想但丑陋的步骤uglyStep = (max - min) / (n - 2)。我们在底部和顶部减去两个标签。 (uglyStep = 1797
  5. 计算uglyStepmagnitude = 10 ^ floor(log10(uglyStep))的数量级。 (magnitude = 1000
  6. 选择最佳漂亮的步骤,将幅度乘以所有漂亮数字乘以10。然后选择它与uglyStep之间差异最小的数字。这将是prettyStep。 (prettyStep = 2000
  7. 将底部和顶部标签的位置计算为bottom = floor(min / prettyStep) * prettySteptop = ceil(max / prettyStep) * prettyStep。注意/表示正常的数学除法,而不是类似C的整数除法。 (bottom = -4000top = 4000
  8. 可以被bottom整除的topprettyStep之间的每个数字都会有一个标签。 (-4000, -2000, 0, 2000, 4000
  9. 如果您不希望minmax非常接近bottomtop,则可能需要进行一些修改。

    此外,它有时表现得有点奇怪,例如对于min = 0max = 3002,它会选择0, 500, 1000, 1500, 2000, 2500, 3000, 3500,但对于max = 3005,它会使用0, 1000, 2000, 3000, 4000