在给定数据范围的情况下,需要巧妙的算法来计算图表坐标轴刻度的粒度。

4

场景:

绘制图表。数据点范围从A到B,希望决定绘制轴刻度的粒度。例如,对于134到151,刻度可能从130到155运行,以便在小数系统中以“整数”开始和结束。但是数字可能从134.31到134.35运行,在这种情况下,从130到135的比例将(视觉上)压缩数据中的“重要性”——最好从134到135或者甚至从134.3到134.4绘制比例尺。而数据值可能从0.013431到0.013435,或者从1343100到1343500。

因此,我正在尝试找出一种优雅的方法来计算要将低边界向下舍入并将上限向上舍入的“粒度”,以生成一个“令人愉悦”的图表。可以通过某种方式“黑客”它,但这样做很难产生“奇怪”的情况会被处理得很好的信心。

有什么想法吗?


1
可能是重复的问题,与https://dev59.com/Y3RC5IYBdhLWcg3wP-n5相似,那里有更多好的答案。 - Geoffrey Zheng
2个回答

2

一个想法:

  1. 将您的范围增加约10%,并根据经验调整此数字
  2. 将范围大小除以您想要拥有的刻度数
  3. 取该数字的以10为底的对数
  4. 将结果乘以三,然后四舍五入到最近的整数
  5. 余数模3将告诉您是否希望最低有效小数以1、2或5的步长更改
  6. 除以3的整数部分将告诉您要使用的十的幂次方
  7. 根据刚刚计算出的刻度频率,获取扩展范围并计算它包含的极端刻度点
  8. 确保所有数据点实际上都在该范围内,如果不在,请添加刻度
  9. 如果需要,通过减少上面的整数来添加次要刻度

+1 -- 是的,十进制对数是我没有想到的。你的算法的其余部分有一些值得思考的有趣点。 - Hot Licks

0

我发现了一个非常有用的计算,它与Excel图表的坐标轴刻度非常相似:

enter image description here

这段代码最初是为Excel编写的,但我将其转换为Objective-C代码以设置我的图表轴。


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