时间/日期轴的漂亮图标签算法?

Aar*_*ron 21 algorithm label graph

我正在寻找一个"好数字"算法来确定日期/时间值轴上的标签.我熟悉Paul Heckbert的Nice Numbers算法.

我有一个在X轴上显示时间/日期的图表,用户可以放大并查看较小的时间范围.我正在寻找一种算法,可以选择好的日期显示在刻度线上.

例如:

  • 看一天左右:1/1:00,1/1 4:00,1/1 8:00 ......
  • 看一周:1/1,1/2,1/3 ......
  • 看一个月:1/09,2/09,3/09 ......

漂亮的标签刻度不需要对应于第一个可见点,而是接近它.

有人熟悉这样的算法吗?

Rob*_*Dam 8

您链接的"好数字"文章提到了这一点

十进制中最好的数字是1,2,5和这些数字的所有10次幂的倍数

所以我认为做类似于日期/时间的事情你需要从类似的分解组件开始.因此,采取每种类型的间隔的好因素:

  • 如果你显示秒或分钟使用1,2,3,5,10,15,30(我跳过6,12,15,20,因为他们没有"感觉"正确).
  • 如果您显示小时数使用1,2,3,4,6,8,12
  • 连续几天使用1,2,7
  • 几周使用1,2,4(13和26适合模型,但对我来说似乎太奇怪)
  • 几个月使用1,2,3,4,6
  • 多年来使用1,2,5和10次幂的倍数

现在很明显,当你进入更大的数量时,这会开始崩溃.当然,你不想显示5周的分钟,即使以30分钟的"漂亮"间隔也是如此.另一方面,当您只有48小时的价值时,您不希望每隔1天显示一次.你已经指出的诀窍是寻找合适的过渡点.

只是预感,我会说合理的交叉点大约是下一个间隔的两倍.这会给你以下(之后显示的最小和最大间隔数)

  • 如果你的价值不到2分钟,则使用秒数(1-120)
  • 如果你的价值不到2小时,则使用分钟(2-120)
  • 如果您的价值少于2天,则使用小时数(2-48)
  • 如果您的价值少于2周,则使用天数(2-14)
  • 如果您的价值少于2个月,则使用周数(2-8/9)
  • 如果你的价值不到2年,则使用数月(2-24)
  • 否则使用年限(尽管如果你的范围可以那么长,你可以继续使用几十年,几个世纪等)

不幸的是,我们的不一致的时间间隔意味着你最终获得某些情况下,可以有超过1百间隔而另一些则在8或9所以你要选择你的时间间隔的大小,比你没有更多最多10-15个间隔(或者少于5个间隔).此外,如果您认为很容易跟踪,您可以从下一个最大间隔的2倍的严格定义中脱离出来.例如,您可以使用最多3天(72小时)和数周(最多4个月)的工作时间.可能需要进行一些试验和错误.

所以要重新选择,根据范围大小选择间隔类型,然后通过选择一个"漂亮"数字来选择间隔大小,这将使您留下5到15个刻度线.或者,如果你知道的和/或可控制蜱之间的像素的实际数量标志着你可以把上限和下限有多少像素蜱之间可以接受的(如果他们太远隔开图可能难以阅读,但如果有太多的刻度线,图形将会混乱,您的标签可能会重叠).