[編集 - 私はhttp://www.acooke.org/cute/AutoScalin0.htmlでもう少しこれを拡大]
「素敵な数字」の素朴な拡張は、アルゴリズムは、時間と分のために良い間隔を与えるベース12と60、のために働くようです。あなたは、0から60まで0から5まで
>>> heckbert(0, 60, limits=LIM60)
['0', '15', '30', '45', '60']
や時間を秒を表示したい場合は、例えば、
LIM10 = (10, [(1.5, 1), (3, 2), (7, 5)], [1, 2, 5])
LIM12 = (12, [(1.5, 1), (3, 2), (8, 6)], [1, 2, 6])
LIM60 = (60, [(1.5, 1), (20, 15), (40, 30)], [1, 15, 40])
def heckbert_d(lo, hi, ntick=5, limits=None):
'''
Heckbert's "nice numbers" algorithm for graph ranges, from "Graphics Gems".
'''
if limits is None:
limits = LIM10
(base, rfs, fs) = limits
def nicenum(x, round):
step = base ** floor(log(x)/log(base))
f = float(x)/step
nf = base
if round:
for (a, b) in rfs:
if f < a:
nf = b
break
else:
for a in fs:
if f <= a:
nf = a
break
return nf * step
delta = nicenum(hi-lo, False)
return nicenum(delta/(ntick-1), True)
def heckbert(lo, hi, ntick=5, limits=None):
'''
Heckbert's "nice numbers" algorithm for graph ranges, from "Graphics Gems".
'''
def _heckbert():
d = heckbert_d(lo, hi, ntick=ntick, limits=limits)
graphlo = floor(lo/d) * d
graphhi = ceil(hi/d) * d
fmt = '%' + '.%df' % max(-floor(log10(d)), 0)
value = graphlo
while value < graphhi + 0.5*d:
yield fmt % value
value += d
return list(_heckbert())
をそう:これは私がちょうど一緒にハッキングコードです
>>> heckbert(0, 5, limits=LIM12)
['0', '2', '4', '6']
"1.5日"、 "9日"などのようなものは、実装の面で(私にとっては)言語依存性が高いです。たとえば、CやC++でも、両方の時間の差をミリ秒単位で保持するにはunsigned longを使用しますが、JavaではおそらくTimeクラスまたはMomentクラスを作成します。 .. – Joanis