Hi,

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.

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
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)

        Set the %(axis_letter)s-scaling: 'log' or 'linear'

        If value is 'log', the additional kwargs have the following meaning

            * base%(axis_letter)s: base of the logarithm

            * subs%(axis_letter)s: a sequence of the location of the minor 
ticks;
              None defaults to autosubs, which depend on the number of
              decades in the plot.  Eg for base 10, subs%(axis_letter)s = (1, 
2, 5) will
              put minor ticks on 1, 2, 5, 11, 12, 15, 21, ....
              To turn off minor ticking, set subs%(axis_letter)s = []

        ACCEPTS: ['log' | 'linear']
        """
        assert(value.lower() in ('log', 'linear'))
        my_axis = _TRAITS_.my_axis(self)
        if value == 'log':
            my_axis.set_major_locator(LogLocator(base_AXISLETTER_))
            my_axis.set_major_formatter(LogFormatterMathtext(base_AXISLETTER_))
            my_axis.set_minor_locator(LogLocator(base_AXISLETTER_, 
subs_AXISLETTER_))
            _TRAITS_.get_my_func(self.transData).set_type(LOG10)
            minval, maxval = _TRAITS_.get_my_lim(self)
            if min(minval, maxval) <= 0:
                self.autoscale_view()
        elif value == 'linear':
            my_axis.set_major_locator(AutoLocator())
            my_axis.set_major_formatter(ScalarFormatter())
            my_axis.set_minor_locator(NullLocator())
            my_axis.set_minor_formatter(NullFormatter())
            _TRAITS_.get_my_func(self.transData).set_type(IDENTITY)

I haven't quite worked through the details, but it looks like it would
cut nearly 400 lines off axes.py (while adding c.200 lines of supporting
code), as well as avoid the type of inconsistency seen in hlines/vlines.
If there's interest, I'll post what I've got so far for comments.

Thanks,

Ben.


- - - - 8< - - - -

--- ORIG/axes.py        2007-07-17 15:24:10.367402000 +0100
+++ NEW/axes.py 2007-07-17 15:38:03.705394000 +0100
@@ -2325,6 +2325,11 @@
         xmin = asarray(xmin)
         xmax = asarray(xmax)

+        if len(xmin)==1:
+            xmin = xmin*ones(y.shape, typecode(y))
+        if len(ymax)==1:
+            xmax = xmax*ones(y.shape, typecode(y))
+

         if len(xmin)!=len(y):
             raise ValueError, 'xmin and y are unequal sized sequences'
@@ -2418,7 +2423,7 @@
         minx = nx.amin(x)
         maxx = nx.amax(x)
         miny = min(nx.amin(ymin), nx.amin(ymax))
-        maxy = max(nx.amax(ymax), nx.amax(ymax))
+        maxy = max(nx.amax(ymin), nx.amax(ymax))
         minx, maxx = self.convert_xunits((minx, maxx))
         miny, maxy = self.convert_yunits((miny, maxy))
         corners = (minx, miny), (maxx, maxy)



-------------------------------------------------------------------------
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
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to