From: Darren D. <dd...@co...> - 2004-09-07 22:35:57
|
John Hunter wrote: >>>>>>"Darren" == Darren Dale <dd...@co...> writes: >>>>>> >>>>>> > > Darren> With MPL 0.62.4, the following script is yielding a few > Darren> badly formatted y-axis labels: > > Darren> import matplotlib from matplotlib.matlab import * > > Darren> a=array([2,4,6,8,10,12,14,16,18,20])*1e5 plot(a) show() > > Darren> I tried adding a "print s,m" statement after line 272: m = > Darren> self._zerorgx.match(s), where s is the original text. Here > Darren> is the output: > > Darren> 2.0e+005 <_sre.SRE_Match object at 0x01249608> 4.0e+005 > Darren> <_sre.SRE_Match object at 0x01249608> 6.0e+005 > Darren> <_sre.SRE_Match object at 0x01249608> 8.0e+005 > Darren> <_sre.SRE_Match object at 0x01249608> 1.0e+006 > Darren> <_sre.SRE_Match object at 0x01249608> 1.2e+006 None > Darren> 1.4e+006 None 1.6e+006 None 1.8e+006 None 2.0e+006 > Darren> <_sre.SRE_Match object at 0x01249608> > > Darren> _zerorgx = re.compile('^(.*?)\.?0+(e[+-]\d+)?$'), which is > Darren> greek to me (and I dont have a good reference on > Darren> regexp's). > >There's a reason Jamie Zawinski said > > Some people, when confronted with a problem, think "I know, I'll use > regular expressions." Now they have two problems. > > >Here's a re-implementation using string methods. See if it passes all >your tests. More importantly, do you agree that removing the zeros >etc which aren't necessary to visually parse the number is a good >idea? > >class ScalarFormatter(Formatter): > """ > Tick location is a plain old number. If viewInterval is set, the > formatter will use %d, %1.#f or %1.ef as appropriate. If it is > not set, the formatter will do str conversion > """ > > def __call__(self, x, pos): > 'Return the format for tick val x at position pos' > self.verify_intervals() > d = abs(self.viewInterval.span()) > > return self.pprint_val(x,d) > > def pprint_val(self, x, d): > #if the number is not too big and it's an int, format it as an > #int > if abs(x)<1e4 and x==int(x): return '%d' % x > > if d < 1e-2: fmt = '%1.3e' > elif d < 1e-1: fmt = '%1.3f' > elif d > 1e5: fmt = '%1.1e' > elif d > 10 : fmt = '%1.1f' > elif d > 1 : fmt = '%1.2f' > else: fmt = '%1.3f' > s = fmt % x > > tup = s.split('e') > if len(tup)==2: > mantissa = tup[0].rstrip('0').rstrip('.') > exponent = tup[1].replace('+', '').lstrip('0') > s = '%se%s' %(mantissa, exponent) > return s > >JDH > > > I strongly support stripping all unnecessary zeros from the labels. It seems a clear choice to me, but I would be interested to know if others are against it. The third to last line needs changing, prepare for hackishness: temp = tup[1][0] + tup[1][1:].lstrip('0') # strip zeros if there is a + or - sign temp.replace('+', '') The regexpr was more elegant, and I don't mind spending an evening learning it so I can continue to work with it. On the other hand, string methods are more accessible. Elegant or accessible? What would "upper management" pick? |