# [Matrix-SIG] algorithm for intelligent axis scaling?

Fri, 19 Mar 1999 16:47:24 +0100

```> I'm afraid this might not be needed anymore, but I guess it's good to have
> as many different opinions on how to solve a particular problem as
> possible...:

Right, so I'll add mine as well (from my Tk plotting widget). You call it
with the lower and upper limits of what you want to see, and it returns
a list of tick marks (value/string pairs):

import Numeric

def ticks(lower, upper):
ideal = (upper-lower)/7.
log = Numeric.log10(ideal)
power = Numeric.floor(log)
fraction = log-power
factor = 1.
error = fraction
for f, lf in multiples:
e = Numeric.fabs(fraction-lf)
if e < error:
error = e
factor = f
grid = factor * 10.**power
if power > 3 or power < -3:
format = '%+7.0e'
elif power >= 0:
digits = max(1, int(power))
format = '%' + `digits`+'.0f'
else:
digits = -int(power)
format = '%'+`digits+2`+'.'+`digits`+'f'
ticks = []
t = -grid*Numeric.floor(-lower/grid)
while t <= upper and len(ticks) < 200:
ticks.append(t, format % (t,))
t = t + grid
return ticks

multiples = [(2., Numeric.log10(2.)), (5., Numeric.log10(5.))]

To decide about the limits to feed to ticks(), I use the following
function. It is called with the smallest and largest value in the
dataset and returns updated values for the limits according to one
of two strategies (minimal plot box or "nicely rounded"):

def axisInterval(spec, lower, upper):
if spec == 'minimal':
if lower == upper:
return lower-0.5, upper+0.5
else:
return lower, upper
if spec == 'automatic':
range = upper-lower
if range == 0.:
return lower-0.5, upper+0.5
log = Numeric.log10(range)
power = Numeric.floor(log)
fraction = log-power
if fraction <= 0.05:
power = power-1
grid = 10.**power
lower = lower - lower % grid
mod = upper % grid
if mod != 0:
upper = upper - mod + grid
return lower, upper
if type(spec) == type(()):
lower, upper = spec
if lower <= upper:
return lower, upper
else:
return upper, lower
raise ValueError, str(spec) + ': illegal axis specification'

--
-------------------------------------------------------------------------------