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

4

如果给定一个 y 值数组,比如 [-3400, -1000, 500, 1200, 3790],我该如何确定“好”的 Y 轴标签并将其放置在网格上?

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

3
这个表述比较模糊,请问您能否再解释一下?如果您只有一个一维数组的值,为什么要显示两个轴?请简洁地进行翻译并尽量不改变原意。 - YXD
1
而且,出于好奇心,为什么要自己做这个呢?几乎所有能够进行绘图的工具都默认处理这个问题。 - Fredrik Pihl
1
你真的需要提供更多关于它的用途、限制、规模等方面的信息。你甚至没有说清楚为什么单纯把文本放在给定的 y 值上这种简单方法不起作用。 - Adam
1个回答

4
你可以按照以下步骤进行操作:
  1. 确定你想要的标签数量(n)。结果可能不会恰好有这么多个标签,但会接近。我将选择 n = 6
  2. 决定哪些数字是“美观”的。你只想看到像1、2、5、10、20、50等步长吗?还是像1、2、4、5、6、8、10等步长也可以?我只考虑1、2和5。
  3. 找出序列的最小值(min)和最大值(max),其余的数字并不重要。(min = -3400max = 3790
  4. 计算理想但不美观的标签间距为:uglyStep = (max - min) / (n - 2)。我们减去底部和顶部的标签数2。(uglyStep = 1797
  5. 计算uglyStep的数量级为:magnitude = 10 ^ floor(log10(uglyStep))。(magnitude = 1000
  6. 通过将数量级乘以所有美观数字和十来选择最佳的美观步长。然后选择与uglyStep之间差异最小的数字。这将是prettyStep。(prettyStep = 2000
  7. 计算底部和顶部标签的位置为:bottom = floor(min / prettyStep) * prettySteptop = ceil(max / prettyStep) * prettyStep。注意,此处的“/”表示普通数学除法,而不是类似C的整数除法。(bottom = -4000top = 4000
  8. bottomtop之间,每个可以被prettyStep整除的数字都会有一个标签。(-4000、-2000、0、2000、4000
如果你不希望minmax非常接近bottomtop,则可能需要进行一些修改。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接