Hallo,

sorry to bother you again. I recognized that I introduced an error in my
last patch :-(

        sym = None
        starlike = False

        # to be API compatible
        if sym is None and not (verts is None):
           ^^^^^^^^^^^

This, of cause, makes no sense. The correct line reads:

       if marker is None and not (verts is None):
          ^^^^^^^^^^^^^^

I've attached a patch... I apologize again ...

Manuel

Manuel Metz wrote:
> John Hunter wrote:
>>>>>>>>>>>>> "Manuel" == Manuel Metz <[EMAIL PROTECTED]> writes:
>>>     Manuel> There is a subtle but essential difference  ;-)  : for i in
>>>     Manuel> xrange(1,len(r), 2 ) ^^^ , i.e. every second value gets
>>>     Manuel> rescaled. But there is probably a more "pythonic" way to
>>>     Manuel> do that:
>>>
>>>     Manuel>         r = 1.0/math.sqrt(math.pi) # unit area r = asarray(
>>>     Manuel> [r,0.5*r]*self.numsides )
>>>
>>>     Manuel> I'm not aware of a better way to do this with numerix  :-(
>>>
>>> Oops, sorry I missed that.  I think what you want is then
>>>
>>>         scale = 0.5/math.sqrt(math.pi)
>>>         r = scale*ones(self.numsides*2)
>>>         r[1::2] *= 0.5
>>>
> 
> I've fixed that - and I've learned something !
> 
>>> OK, if I could make a few more suggestions (I feel like a customer at
>>> a restaurant where every time the waiter brings me a cup of coffee I
>>> ask "just one more thing"...)
>>>
>>> +        old_ymin,old_ymax = self.get_ylim()
>>>
>>> The matplotlib style guidelines are
>>>
>>>   UpperCase : classes
>>>   lower_underscore  : functions and methods
>>>   lower or lowerUpper : variables or attributes
>>>
>>> For shortish variable names, I prefer
>>>
>>>         oldymin, oldymax = self.get_ylim()
> 
> Ah - there are three lines that I touched for only one reason: the line
> indention was done with a "tab" instead of "spaces". When I recognised
> this in my text editor, I changed it to space-indention. That's the only
> reason for these patched lines.
> 
>>> +        if isinstance(marker, str) or isinstance(marker, unicode):
>>> +            # the standard way to define symbols using a string
> character
>>> +            sym = syms.get(marker)
>>>
>>> +        if isinstance(marker, tuple) or isinstance(marker, list):
>>> +            # accept marker to be:
>>> +            #    (numsides, style, [angle])
>>>
>>> +            if isinstance(marker[0], int) or isinstance(marker[0],
> long):
>>> +                # (numsides, style, [angle])
>>>
>>> Here you should use "duck typing" not "type checking" (google "duck
>>> typing").  matplotlib.cbook provides several duck typing functions, eg
>>> is_stringlike, iterable and is_numlike.  Take a look at is_numlike
>>>
>>> def is_numlike(obj):
>>>     try: obj+1
>>>     except TypeError: return False
>>>     else: return True
>>>
>>> Ie, if it acts like a number (you can add one to it) then we'll treat
>>> it as a number.  This allows users to provide other integer like
>>> classes which are not ints or longs.  Everytime you use isinstance,
>>> take a 2nd look.  There may be a better way.
>>>
>>> I'll await your updated patch  :-)
> 
> I've fixed that too - and learned even more  ;-)  Thanks !
> 
> Patch against latest revision is attached.
> 
> Manuel
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: axes.py
> ===================================================================
> --- axes.py   (revision 2811)
> +++ axes.py   (working copy)
> @@ -14,8 +14,9 @@
>  from artist import Artist, setp
>  from axis import XAxis, YAxis
>  from cbook import iterable, is_string_like, flatten, enumerate, \
> -     allequal, dict_delall, popd, popall, silent_list
> -from collections import RegularPolyCollection, PolyCollection, 
> LineCollection, QuadMesh
> +     allequal, dict_delall, popd, popall, silent_list, is_numlike
> +from collections import RegularPolyCollection, PolyCollection, 
> LineCollection, QuadMesh, \
> +     StarPolygonCollection
>  from colors import colorConverter, normalize, Colormap, \
>          LinearSegmentedColormap, looks_like_color, is_color_like
>  import cm
> @@ -1211,7 +1212,7 @@
>          if xmax is None and hasattr(xmin,'__len__'):
>              xmin,xmax = xmin
>  
> -     old_xmin,old_xmax = self.get_xlim()
> +        old_xmin,old_xmax = self.get_xlim()
>          if xmin is None: xmin = old_xmin
>          if xmax is None: xmax = old_xmax
>  
> @@ -1223,7 +1224,7 @@
>              xmin -= 1e-38
>              xmax += 1e-38
>  
> -     self.viewLim.intervalx().set_bounds(xmin, xmax)
> +        self.viewLim.intervalx().set_bounds(xmin, xmax)
>          if emit: self._send_xlim_event()
>          return xmin, xmax
>  
> @@ -1324,7 +1325,7 @@
>          if ymax is None and hasattr(ymin,'__len__'):
>              ymin,ymax = ymin
>  
> -     old_ymin,old_ymax = self.get_ylim()
> +        old_ymin,old_ymax = self.get_ylim()
>          if ymin is None: ymin = old_ymin
>          if ymax is None: ymax = old_ymax
>  
> @@ -3100,10 +3101,9 @@
>              'h' : hexagon
>              '8' : octagon
>  
> +        If marker is None and verts is not None, verts is a sequence
> +        of (x,y) vertices for a custom scatter symbol.
>  
> -        if marker is None and verts is not None, verts is a sequence
> -        of (x,y) vertices for a custom scatter symbol.  The
> -
>          s is a size argument in points squared.
>  
>          Any or all of x, y, s, and c may be masked arrays, in which
> @@ -3171,26 +3171,74 @@
>          if faceted: edgecolors = None
>          else: edgecolors = 'None'
>  
> -        sym = syms.get(marker)
> -        if sym is None and verts is None:
> -            raise ValueError('Unknown marker symbol to scatter')
> -
> +        sym = None
> +        starlike = False
> +        
> +        # to be API compatible
> +        if sym is None and not (verts is None):
> +            marker = (verts, 0)
> +            verts = None
> +        
> +        if is_string_like(marker):
> +            # the standard way to define symbols using a string character
> +            sym = syms.get(marker)
> +            if sym is None and verts is None:
> +                raise ValueError('Unknown marker symbol to scatter')
> +            numsides, rotation = syms[marker]
> +        
> +        elif iterable(marker):
> +            # accept marker to be:
> +            #    (numsides, style, [angle])
> +            # or
> +            #    (verts[], style, [angle])
> +            
> +            if len(marker)<2 or len(marker)>3:
> +                raise ValueError('Cannot create markersymbol from marker')
> +            
> +            if is_numlike(marker[0]):
> +                # (numsides, style, [angle])
> +                
> +                if len(marker)==2:
> +                    numsides, rotation = marker[0], math.pi/4.
> +                elif len(marker)==3:
> +                    numsides, rotation = marker[0], marker[2]
> +                sym = True
> +                
> +                if marker[1]==1:
> +                    # starlike symbol, everthing else is interpreted as 
> solid symbol
> +                    starlike = True
> +            
> +            else:
> +                verts = asarray(marker[0])
> +                
>          if sym is not None:
> -            numsides, rotation = syms[marker]
> -            collection = RegularPolyCollection(
> -                self.figure.dpi,
> -                numsides, rotation, scales,
> -                facecolors = colors,
> -                edgecolors = edgecolors,
> -                linewidths = linewidths,
> -                offsets = zip(x,y),
> -                transOffset = self.transData,
> -                )
> +            if not starlike:
> +                collection = RegularPolyCollection(
> +                    self.figure.dpi,
> +                    numsides, rotation, scales,
> +                    facecolors = colors,
> +                    edgecolors = edgecolors,
> +                    linewidths = linewidths,
> +                    offsets = zip(x,y),
> +                    transOffset = self.transData,
> +                    )
> +            else:
> +                collection = StarPolygonCollection(
> +                    self.figure.dpi,
> +                    numsides, rotation, scales,
> +                    facecolors = colors,
> +                    edgecolors = edgecolors,
> +                    linewidths = linewidths,
> +                    offsets = zip(x,y),
> +                    transOffset = self.transData,
> +                    )
>          else:
> -            verts = asarray(verts)
> -            # hmm, the scaling is whacked -- how do we want to scale with 
> custom verts?
> +            # rescale verts
> +            rescale = sqrt(max(verts[:,0]**2+verts[:,1]**2))
> +            verts /= rescale
> +            
>              scales = asarray(scales)
> -            #scales = sqrt(scales * self.figure.dpi.get() / 72.)
> +            scales = sqrt(scales * self.figure.dpi.get() / 72.)
>              if len(scales)==1:
>                  verts = [scales[0]*verts]
>              else:
> Index: collections.py
> ===================================================================
> --- collections.py    (revision 2811)
> +++ collections.py    (working copy)
> @@ -15,7 +15,7 @@
>  from cbook import is_string_like, iterable
>  from colors import colorConverter
>  from cm import ScalarMappable
> -from numerix import arange, sin, cos, pi, asarray, sqrt, array, newaxis
> +from numerix import arange, sin, cos, pi, asarray, sqrt, array, newaxis, ones
>  from transforms import identity_transform
>  
>  class Collection(Artist):
> @@ -293,7 +293,7 @@
>          * dpi is the figure dpi instance, and is required to do the
>            area scaling.
>  
> -        * numsides: the number of sides of the  polygon
> +        * numsides: the number of sides of the polygon
>  
>          * sizes gives the area of the circle circumscribing the
>            regular polygon in points^2
> @@ -374,6 +374,43 @@
>          raise NotImplementedError('Vertices in data coordinates are 
> calculated\n'
>                  + 'only with offsets and only if _transOffset == dataTrans.')
>  
> +class StarPolygonCollection(RegularPolyCollection):
> +    def __init__(self,
> +                 dpi,
> +                 numsides,
> +                 rotation = 0 ,
> +                 sizes = (1,),
> +                 **kwargs):
> +        """
> +        Draw a regular star like Polygone with numsides.
> +        
> +        * dpi is the figure dpi instance, and is required to do the
> +          area scaling.
> +
> +        * numsides: the number of sides of the polygon
> +
> +        * sizes gives the area of the circle circumscribing the
> +          regular polygon in points^2
> +
> +        * rotation is the rotation of the polygon in radians
> +
> +        kwargs: See PatchCollection for more details
> +
> +          * offsets are a sequence of x,y tuples that give the centers of
> +            the polygon in data coordinates
> +
> +          * transOffset is the Transformation instance used to
> +            transform the centers onto the canvas.
> +        """
> +        RegularPolyCollection.__init__(self, dpi, numsides, rotation, sizes, 
> **kwargs)
> +    
> +    def _update_verts(self):
> +        scale = 1.0/math.sqrt(math.pi)
> +        r = scale*ones(self.numsides*2)
> +        r[1::2] *= 0.5
> +        theta  = (2.*math.pi/(2*self.numsides))*arange(2*self.numsides) + 
> self.rotation
> +        self._verts = zip( r*sin(theta), r*cos(theta) )
> +
>  class LineCollection(Collection, ScalarMappable):
>      """
>      All parameters must be sequences.  The property of the ith line
> 
> 
> ------------------------------------------------------------------------
> 
> -------------------------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Matplotlib-devel mailing list
> Matplotlib-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

-- 
---------------------------------------
  Manuel Metz  ............  [EMAIL PROTECTED]
  Argelander Institut fuer Astronomie
  Auf dem Huegel 71 (room 3.06)
  D - 53121 Bonn

  E-Mail: [EMAIL PROTECTED]
  Web:    www.astro.uni-bonn.de/~mmetz
  Phone:  (+49) 228 / 73-3660
  Fax:    (+49) 228 / 73-3672
---------------------------------------
Index: axes.py
===================================================================
--- axes.py	(revision 2814)
+++ axes.py	(working copy)
@@ -3175,7 +3175,7 @@
         starlike = False
         
         # to be API compatible
-        if sym is None and not (verts is None):
+        if marker is None and not (verts is None):
             marker = (verts, 0)
             verts = None
         
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to