【问题标题】:Given data range, need clever algorithm to calculate granularity of graph axis scales给定数据范围,需要巧妙的算法来计算图轴尺度的粒度
【发布时间】:2012-11-15 19:02:46
【问题描述】:

场景:

绘制图表。拥有从 A 到 B 的数据点,并且想要决定绘制轴刻度的粒度。例如,对于 134 到 151,比例可能从 130 到 155,以十进制系统中的“整数”数字开始和结束。但数字可能从 134.31 到 134.35,在这种情况下,从 130 到 135 的比例会(视觉上)压缩数据中的“重要性”——最好将比例从 134 画到 135,甚至可能134.3 至 134.4。而数据值可能会从 0.013431 到 0.013435,或从 1343100 到 1343500。

因此,我试图找出一种优雅的方法来计算“粒度”,将下限向下舍入,将上限向上舍入,以生成“令人愉悦”的图表。人们可以以某种方式“破解”它,但这不会让人相信“奇怪”的情况会得到妥善处理。

有什么想法吗?

【问题讨论】:

标签: algorithm


【解决方案1】:

只是一个想法:

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

【讨论】:

  • +1 -- 是的,以 10 为底的日志是我没有想到的。你的算法的其余部分有一些有趣的地方需要思考。
【解决方案2】:

我发现了一个非常有用的calculation,它与excel图表的轴刻度非常相似:

它是为 excel 编写的,但我使用并将其转换为 Objective-c 代码来设置我的图形轴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2020-07-31
    • 2022-07-03
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多