On Sat, Jul 11, 2009 at 9:55 AM, Eli Brosh<ebro...@gmail.com> wrote: > Thanks John, > A kwarg fillstyle with options 'full|top|bottom|left|right' for any marker > is certainly better than what i have done. > I just did not have an idea how to program this kwarg. > Further, I can't see an easy way of generalizing the half-filling of > markers. > is there a better way than just programming each half-filled marker > separately ? > Perhaps if you can give me some hints, I can try to do the rest of the work.
Sure, first take a look at the coding guide, in particular these two sections which introduce kwarg processing and documentation conventions. http://matplotlib.sourceforge.net/devel/coding_guide.html#keyword-argument-processing http://matplotlib.sourceforge.net/devel/coding_guide.html#documentation-and-docstrings Basically, any new "property", where I use quotes because mpl properties are not the same as python properties, needs a setter and getter. The setter must also have an ACCEPTS flag, which gives the acceptable arguments. mpl uses these in the setp and getp introspection facilities, as well as in the auto-table building of kwargs in the docs. The artist.ArtistInspector is used to insepct the functions and docs to extract the properties: http://matplotlib.sourceforge.net/api/artist_api.html#matplotlib.artist.ArtistInspector I've committed a patch to svn that implements the fillstyle property for Line2D, and implemented it for draw_square. The other filled markers raise a NotImplementedError if the fillstyle is not 'full', and that is where you come in. The basic implementation is to draw two half markers, one filled and one unfilled, and use the rotation property of the transformation to support the various left|right|bottom|top. Here is the reference implementation for draw_square:: def _draw_square(self, renderer, gc, path, path_trans): gc.set_snap(renderer.points_to_pixels(self._markersize) >= 2.0) side = renderer.points_to_pixels(self._markersize) transform = Affine2D().translate(-0.5, -0.5).scale(side) rgbFace = self._get_rgb_face() fs = self.get_fillstyle() if fs=='full': renderer.draw_markers(gc, Path.unit_rectangle(), transform, path, path_trans, rgbFace) else: # build a bottom filled square out of two rectangles, one # filled. Use the rotation to support left, right, bottom # or top if fs=='bottom': rotate = 0. elif fs=='top': rotate = 180. elif fs=='left': rotate = 270. else: rotate = 90. bottom = Path([[0.0, 0.0], [1.0, 0.0], [1.0, 0.5], [0.0, 0.5], [0.0, 0.0]]) top = Path([[0.0, 0.5], [1.0, 0.5], [1.0, 1.0], [0.0, 1.0], [0.0, 0.05]]) transform = transform.rotate_deg(rotate) renderer.draw_markers(gc, bottom, transform, path, path_trans, rgbFace) renderer.draw_markers(gc, top, transform, path, path_trans, None) See examples/pylab_examples/fillstyle_demo.py in svn, and the attached patch (although this is already committed, it might be instructional so you can see the steps needed to add a new property). When you finish the others, send along an svn diff and some more examples in the fillstyle_demo and I'll commit it. Thanks! JDH
fillstyle.diff
Description: Binary data
------------------------------------------------------------------------------ Enter the BlackBerry Developer Challenge This is your chance to win up to $100,000 in prizes! For a limited time, vendors submitting new applications to BlackBerry App World(TM) will have the opportunity to enter the BlackBerry Developer Challenge. See full prize details at: http://p.sf.net/sfu/Challenge
_______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users