On 7/17/07, Ben North <[EMAIL PROTECTED]> wrote:
> There is a difference in the behaviour of Axes.hlines() vs
> Axes.vlines(), in that vlines() lets you supply scalars for ymin and
> ymax, whereas hlines() doesn't (for xmin and xmax). The patch below
> fixes that, and also what looks like a separate bug in vlines. There
> are also other differences, around units, but I haven't worked with that
> area of matplotlib so will leave that for others.
Thanks for catching that -- I recently introduced this bug when I
numpified the axes module. Fixed in svn
> I was wondering, though, whether there'd be any support for some work
> which tidied up the near-duplicate code in axes.py. I've been playing
Certainly, but probably not using meta-classes.
> around with an approach using python's metaclass support, which, for
> example, would replace the definitions of the two near-identical
> functions set_xscale() and set_yscale() with the one meta-definition:
>
> @MC_Traited.construct_traited_variants
> def set__AXISLETTER_scale(self, value, base_AXISLETTER_ = 10,
> subs_AXISLETTER_ = None):
> """
> SET_%(axis_letter_UC)sSCALE(value, base%(axis_letter)s = 10,
> subs%(axis_letter)s = None)
I'm disinclined to use python black magic -- I find it makes the code
harder to grok for the typical scientist, and these are our main
developers. Most of these guys are still trying to figure out what a
class is <wink>
But there are other ways to reduce code duplication that are not as clever
def set_xscale(self, value, basex = 10, subsx=None):
self._set_scale(axis=self.xaxis,
transfunc=self.transData.get_funcx(),
limfunc=self.get_xlim,
value=value,
base=basex,
subse=subsx)
def set_yscale(self, value, basex = 10, subsx=None):
self._set_scale(axis=self.yaxis,
transfunc=self.transData.get_funcy(),
limfunc=self.get_ylim,
value=value,
base=basey,
subse=subsy)
def _set_scale(self, axis, transfunc, limfunc, value, basex = 10, subsx=None):
assert(value.lower() in ('log', 'linear', ))
if value == 'log':
axis.set_major_locator(mticker.LogLocator(base))
axis.set_major_formatter(mticker.LogFormatterMathtext(base))
axis.set_minor_locator(mticker.LogLocator(base,subsx))
transfunc.set_type(mtrans.LOG10)
minx, maxx = limfunc()
if min(minx, maxx)<=0:
self.autoscale_view()
elif value == 'linear':
axis.set_major_locator(mticker.AutoLocator())
axis.set_major_formatter(mticker.ScalarFormatter())
axis.set_minor_locator(mticker.NullLocator())
axis.set_minor_formatter(mticker.NullFormatter())
transfunc.set_type( mtrans.IDENTITY )
which I definitely encourage. There may be something more elegant
than this, but we only try to be a little clever. Get too clever, and
Darren and Eric will yell at you.
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Matplotlib-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users