One thing I cannot work out is the axis number presentation.
Cannot find any documentation about how to control the presentation of the axis number.
Currently using the default TKAgg plotting GUI backend.
It seems the axis will show up to 3 digits, then switch to Scientific notation. (10, 100, 1e3, 1e4, 1e5 etc)
However I would prefer it would present in enginering notation (10, 100, 1e3, 10e3, 100e3, 1e6, 10e6 ...etc)
While I could handle some of this scaling before plotting (make numbers in the Milli-Seconds range), it becomes non-intutive when I zoom in on details (in the Nano-Second range), and the number becomes 1.23e-4 of a milli sec.
I'd prefer to just plot Seconds, and let Matplotlib scale the number to one of mS, uS, nS, as appropriate for the graph range, and zoom level.
Is this outside the scope of the supplied GUI widget?
Do I need to start thinking of using the plot widget directly, create my own GUI interface, and writing code to handle the scaling of axis in the way I like?
One thing I cannot work out is the axis number presentation.
Cannot find any documentation about how to control the presentation of
the axis number.
Poke around ticker.formatter
However I would prefer it would present in enginering notation (10, 100,
1e3, 10e3, 100e3, 1e6, 10e6 ...etc)
The easiest is to define your own formatter. Please try the solution below.
You can use it as:
gca().xaxis.set_major_formatter(EngrFormatter(3))
···
#####
------------------------------------------------------------------------- #---- --- Formatters ---
#####
-------------------------------------------------------------------------
class EngrFormatter(ScalarFormatter):
"""A variation of the standard ScalarFormatter, using only multiples of
three
in the mantissa. A fixed number of decimals can be displayed with the optional
parameter `ndec` . If `ndec` is None (default), the number of decimals is
defined
from the current ticks.
"""
def __init__(self, ndec=None, useOffset=True, useMathText=False):
ScalarFormatter.__init__(self, useOffset, useMathText)
if ndec is None or ndec < 0:
self.format = None
elif ndec == 0:
self.format = "%d"
else:
self.format = "%%1.%if" % ndec
#........................
def _set_orderOfMagnitude(self, mrange):
"""Sets the order of margnitude."""
ScalarFormatter._set_orderOfMagnitude(self, mrange)
self.orderOfMagnitude = 3*(self.orderOfMagnitude//3)
#........................
def _set_format(self):
"""Sets the format string to format all ticklabels."""
# set the format string to format all the ticklabels
locs = (N.array(self.locs)-self.offset) /
10**self.orderOfMagnitude+1e-15
sigfigs = [len(str('%1.3f'% loc).split('.')[1].rstrip('0')) \
for loc in locs]
sigfigs.sort()
if self.format is None:
self.format = '%1.' + str(sigfigs[-1]) + 'f'
if self._usetex or self._useMathText: self.format = '%s'%self.format
I've taken a while to get around to it, but this code worked a treat, and taught me a little about how I can override things in matplotlib
Thanks
Steve
Pierre GM wrote:
···
One thing I cannot work out is the axis number presentation.
Cannot find any documentation about how to control the presentation of
the axis number.
Poke around ticker.formatter
However I would prefer it would present in enginering notation (10, 100,
1e3, 10e3, 100e3, 1e6, 10e6 ...etc)
The easiest is to define your own formatter. Please try the solution below. You can use it as:
gca().xaxis.set_major_formatter(EngrFormatter(3))
##### ------------------------------------------------------------------------- #---- --- Formatters ---
##### -------------------------------------------------------------------------
class EngrFormatter(ScalarFormatter):
"""A variation of the standard ScalarFormatter, using only multiples of three
in the mantissa. A fixed number of decimals can be displayed with the optional parameter `ndec` . If `ndec` is None (default), the number of decimals is defined
from the current ticks.
"""
def __init__(self, ndec=None, useOffset=True, useMathText=False):
ScalarFormatter.__init__(self, useOffset, useMathText)
if ndec is None or ndec < 0:
self.format = None
elif ndec == 0:
self.format = "%d"
else:
self.format = "%%1.%if" % ndec
#........................
def _set_orderOfMagnitude(self, mrange):
"""Sets the order of margnitude."""
ScalarFormatter._set_orderOfMagnitude(self, mrange)
self.orderOfMagnitude = 3*(self.orderOfMagnitude//3)
#........................
def _set_format(self):
"""Sets the format string to format all ticklabels."""
# set the format string to format all the ticklabels
locs = (N.array(self.locs)-self.offset) / 10**self.orderOfMagnitude+1e-15
sigfigs = [len(str('%1.3f'% loc).split('.')[1].rstrip('0')) \
for loc in locs]
sigfigs.sort()
if self.format is None:
self.format = '%1.' + str(sigfigs[-1]) + 'f'
if self._usetex or self._useMathText: self.format = '%s'%self.format
Glad you found it useful.
playing some more about it, I realized that there could be some improvement
with small values between 0.001 and 1: the following modifications should
take care of that:
def _set_orderOfMagnitude(self, mrange):
"""Sets the order of margnitude."""
locs = N.absolute(self.locs)
if self.offset:
oom = math.floor(math.log10(mrange))
else:
if locs[0] > locs[-1]:
val = locs[0]
else:
val = locs[-1]
if val == 0:
oom = 0
else:
oom = math.floor(math.log10(val))
if oom <= -3:
self.orderOfMagnitude = 3*(oom//3)
elif oom <= -1:
self.orderOfMagnitude = -3
elif oom >= 4:
self.orderOfMagnitude = 3*(oom//3)
else:
self.orderOfMagnitude = 0
···
On Tuesday 21 November 2006 22:09, Stephen George wrote:
Thank you Pierre,
I've taken a while to get around to it, but this code worked a treat,
and taught me a little about how I can override things in matplotlib