很久以前,我写了一个图形模块很好地涵盖了这一点。挖掘灰色块得到以下结果:
- 确定数据的上下限。(请注意下界=上限的特殊情况!
- 将范围划分为所需的刻度数。
- 将刻度范围四舍五入成不错的数量。
- 相应地调整上下限。
让我们举个例子:
15, 234, 140, 65, 90 with 10 ticks
- 下界= 15
- 上限= 234
- 范围= 234-15 = 219
- 刻度范围= 21.9。这应该是25.0
- 新的下界= 25 *圆(15/25)= 0
- 新上限= 25 *舍入(1 + 235/25)= 250
所以范围= 0,25,50,…,225,250
您可以通过以下步骤获得合适的刻度范围:
- 除以10 ^ x,使结果介于0.1和1.0之间(包括0.1排除1)。
- 相应地翻译:
- 0.1-> 0.1
- <= 0.2-> 0.2
- <= 0.25-> 0.25
- <= 0.3-> 0.3
- <= 0.4-> 0.4
- <= 0.5-> 0.5
- <= 0.6-> 0.6
- <= 0.7-> 0.7
- <= 0.75-> 0.75
- <= 0.8-> 0.8
- <= 0.9-> 0.9
- <= 1.0-> 1.0
- 乘以10 ^ x。
在这种情况下,将21.9除以10 ^ 2得到0.219。这是<= 0.25,所以我们现在有0.25。乘以10 ^ 2得到25。
让我们看一下具有8个滴答声的相同示例:
15, 234, 140, 65, 90 with 8 ticks
- 下界= 15
- 上限= 234
- 范围= 234-15 = 219
- 刻度范围= 27.375
- 用10 ^ 2除以0.27375,转换为0.3,得出(乘以10 ^ 2)30。
- 新的下界= 30 *圆(15/30)= 0
- 新上限= 30 *舍入(1 + 235/30)= 240
给出您要求的结果;-)。
------ KD添加了------
这是无需使用查找表等即可实现此算法的代码:
double range = ...;int tickCount = ...;double unroundedTickSize = range/(tickCount-1);double x = Math.ceil(Math.log10(unroundedTickSize)-1);double pow10x = Math.pow(10, x);double roundedTickRange = Math.ceil(unroundedTickSize / pow10x) * pow10x;return roundedTickRange;
一般而言,刻度数包括底部刻度,因此实际的y轴分段比刻度数少一个。



