Revision: 8059
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8059&view=rev
Author:   mdboom
Date:     2009-12-31 16:45:59 +0000 (Thu, 31 Dec 2009)

Log Message:
-----------
Add support for mathtext markers (thanks to tcb for original work)

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/examples/pylab_examples/line_styles.py
    trunk/matplotlib/lib/matplotlib/cbook.py
    trunk/matplotlib/lib/matplotlib/lines.py
    trunk/matplotlib/lib/matplotlib/text.py
    trunk/matplotlib/src/_path.cpp

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2009-12-31 15:48:55 UTC (rev 8058)
+++ trunk/matplotlib/CHANGELOG  2009-12-31 16:45:59 UTC (rev 8059)
@@ -1,3 +1,6 @@
+2009-12-31 Add support for using math text as marker symbols (Thanks to tcb)
+           - MGD
+
 2009-12-31 Commit a workaround for a regression in PyQt4-4.6.{0,1} - DSD
 
 2009-12-22 Fix cmap data for gist_earth_r, etc. -JJL
@@ -20,7 +23,7 @@
            Added new examples. - JJL
 
 2009-12-01 Applied Laurent Dufrechou's patch to improve blitting with
-           the qt4 backend - DSD 
+           the qt4 backend - DSD
 
 2009-11-13 The pdf backend now allows changing the contents of
            a pdf file's information dictionary via PdfPages.infodict. - JKS
@@ -153,35 +156,35 @@
 
 2009-08-06 Tagging the 0.99.0 release at svn r7397 - JDH
 
-          * fixed an alpha colormapping bug posted on sf 2832575
+           * fixed an alpha colormapping bug posted on sf 2832575
 
-          * fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py
+           * fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py
              (patch by Christoph Gohlke)
 
-          * remove dup gui event in enter/leave events in gtk
+           * remove dup gui event in enter/leave events in gtk
 
-          * lots of fixes for os x binaries (Thanks Russell Owen)
+           * lots of fixes for os x binaries (Thanks Russell Owen)
 
-          * attach gtk events to mpl events -- fixes sf bug 2816580
+           * attach gtk events to mpl events -- fixes sf bug 2816580
 
-          * applied sf patch 2815064 (middle button events for wx) and
+           * applied sf patch 2815064 (middle button events for wx) and
              patch  2818092 (resize events for wx)
 
-          * fixed boilerplate.py so it doesn't break the ReST docs.
+           * fixed boilerplate.py so it doesn't break the ReST docs.
 
-          * removed a couple of cases of mlab.load
+           * removed a couple of cases of mlab.load
 
-          * fixed rec2csv win32 file handle bug from sf patch 2831018
+           * fixed rec2csv win32 file handle bug from sf patch 2831018
 
-          * added two examples from Josh Hemann: 
examples/pylab_examples/barchart_demo2.py
+           * added two examples from Josh Hemann: 
examples/pylab_examples/barchart_demo2.py
              and examples/pylab_examples/boxplot_demo2.py
 
-          * handled sf bugs 2831556 and 2830525; better bar error messages and
+           * handled sf bugs 2831556 and 2830525; better bar error messages and
              backend driver configs
 
-          * added miktex win32 patch from sf patch 2820194
+           * added miktex win32 patch from sf patch 2820194
 
-          * apply sf patches 2830233 and 2823885 for osx setup and 64 bit;  
thanks Michiel
+           * apply sf patches 2830233 and 2823885 for osx setup and 64 bit;  
thanks Michiel
 
 2009-08-04 Made cbook.get_sample_data make use of the ETag and Last-Modified
            headers of mod_dav_svn. - JKS

Modified: trunk/matplotlib/examples/pylab_examples/line_styles.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/line_styles.py     2009-12-31 
15:48:55 UTC (rev 8058)
+++ trunk/matplotlib/examples/pylab_examples/line_styles.py     2009-12-31 
16:45:59 UTC (rev 8059)
@@ -17,19 +17,28 @@
     except TypeError:
         pass
 
-styles = linestyles + markers
+styles = markers + [
+    r'$\lambda$',
+    r'$\bowtie$',
+    r'$\circlearrowleft$',
+    r'$\clubsuit$',
+    r'$\checkmark$']
 
 colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k')
 
+plt.figure(figsize=(8,8))
 
 axisNum = 0
-for row in range(5):
+for row in range(6):
     for col in range(5):
         axisNum += 1
-        ax = plt.subplot(5, 5, axisNum)
-        style = styles[axisNum % len(styles) ]
-        color = colors[axisNum % len(colors) ]
-        plt.plot(t,s, style + color, markersize=10)
+        ax = plt.subplot(6, 5, axisNum)
+        color = colors[axisNum % len(colors)]
+        if axisNum < len(linestyles):
+            plt.plot(t, s, linestyles[axisNum], color=color, markersize=10)
+        else:
+            style = styles[(axisNum - len(linestyles)) % len(styles)]
+            plt.plot(t, s, linestyle='None', marker=style, color=color, 
markersize=10)
         ax.set_yticklabels([])
         ax.set_xticklabels([])
 

Modified: trunk/matplotlib/lib/matplotlib/cbook.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/cbook.py    2009-12-31 15:48:55 UTC (rev 
8058)
+++ trunk/matplotlib/lib/matplotlib/cbook.py    2009-12-31 16:45:59 UTC (rev 
8059)
@@ -1676,8 +1676,17 @@
         else:
             break
 
+def is_math_text(s):
+    # Did we find an even number of non-escaped dollar signs?
+    # If so, treat is as math text.
+    s = unicode(s)
 
+    dollar_count = s.count(r'$') - s.count(r'\$')
+    even_dollars = (dollar_count > 0 and dollar_count % 2 == 0)
 
+    return even_dollars
+
+
 if __name__=='__main__':
     assert( allequal([1,1,1]) )
     assert(not  allequal([1,1,0]) )

Modified: trunk/matplotlib/lib/matplotlib/lines.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/lines.py    2009-12-31 15:48:55 UTC (rev 
8058)
+++ trunk/matplotlib/lib/matplotlib/lines.py    2009-12-31 16:45:59 UTC (rev 
8059)
@@ -12,7 +12,7 @@
 import artist
 from artist import Artist
 from cbook import iterable, is_string_like, is_numlike, ls_mapper, dedent,\
-flatten
+flatten, is_math_text
 from colors import colorConverter
 from path import Path
 from transforms import Affine2D, Bbox, TransformedPath, IdentityTransform
@@ -20,6 +20,7 @@
 from matplotlib import rcParams
 from artist import allow_rasterization
 from matplotlib import docstring
+from matplotlib.font_manager import FontProperties
 
 # special-purpose marker identifiers:
 (TICKLEFT, TICKRIGHT, TICKUP, TICKDOWN,
@@ -139,7 +140,7 @@
     }
 
     filled_markers = ('o', '^', 'v', '<', '>',
-                        's', 'd', 'D', 'h', 'H', 'p', '*')
+                      's', 'd', 'D', 'h', 'H', 'p', '*')
 
     zorder = 2
     validCap = ('butt', 'round', 'projecting')
@@ -535,7 +536,7 @@
             gc.set_foreground(self.get_markeredgecolor())
             gc.set_linewidth(self._markeredgewidth)
             gc.set_alpha(self._alpha)
-            funcname = self._markers.get(self._marker, '_draw_nothing')
+            funcname = self._markerFunc
             if funcname != '_draw_nothing':
                 tpath, affine = 
self._transformed_path.get_transformed_points_and_affine()
                 if len(tpath.vertices):
@@ -573,7 +574,8 @@
     def get_markeredgecolor(self):
         if (is_string_like(self._markeredgecolor) and
             self._markeredgecolor == 'auto'):
-            if self._marker in self.filled_markers:
+            if (self._marker in self.filled_markers or
+                is_math_text(self._marker)):
                 return 'k'
             else:
                 return self._color
@@ -774,6 +776,7 @@
         'None'     nothing
         ' '        nothing
         ''         nothing
+        '$...$'    render the string using mathtext
         ========== ==========================
 
 
@@ -782,16 +785,18 @@
                  | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd'
                  | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|'
                  | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT
-                 | 'None' | ' ' | '' ]
+                 | 'None' | ' ' | '' | '$...$']
 
         """
-        if marker not in self._markers:
+        if marker in self._markers:
+            self._marker = marker
+            self._markerFunc = self._markers[marker]
+        elif is_math_text(marker):
+            self._marker = marker
+            self._markerFunc = '_draw_mathtext_path'
+        else: #already handle ' ', '' in marker list
             verbose.report('Unrecognized marker style %s, %s' %
                                             (marker, type(marker)))
-        if marker in [' ','']:
-            marker = 'None'
-        self._marker = marker
-        self._markerFunc = self._markers[marker]
 
     def set_markeredgecolor(self, ec):
         """
@@ -867,6 +872,38 @@
     def _draw_lines(self, renderer, gc, path, trans):
         self._lineFunc(renderer, gc, path, trans)
 
+    def _draw_mathtext_path(self, renderer, gc, path, trans):
+        """
+        Draws mathtext markers '$...$' using TextPath object.
+
+        Submitted by tcb
+        """
+        from matplotlib.patches import PathPatch
+        from matplotlib.text import TextPath
+
+        gc.set_snap(False)
+
+        # again, the properties could be initialised just once outside
+        # this function
+        # Font size is irrelevant here, it will be rescaled based on
+        # the drawn size later
+        props = FontProperties(size=1.0)
+        text = TextPath(xy=(0,0), s=self.get_marker(), fontproperties=props,
+                        usetex=rcParams['text.usetex'])
+        if len(text.vertices) == 0:
+            return
+        xmin, ymin = text.vertices.min(axis=0)
+        xmax, ymax = text.vertices.max(axis=0)
+        width = xmax - xmin
+        height = ymax - ymin
+        max_dim = max(width, height)
+        path_trans = Affine2D() \
+            .translate(0.5 * -width, 0.5 * -height) \
+            .scale((renderer.points_to_pixels(self.get_markersize()) / 
max_dim))
+
+        rgbFace = self._get_rgb_face()
+        renderer.draw_markers(gc, text, path_trans, path, trans, rgbFace)
+
     def _draw_steps_pre(self, renderer, gc, path, trans):
         vertices = self._xy
         steps = ma.zeros((2*len(vertices)-1, 2), np.float_)
@@ -1288,6 +1325,7 @@
 
         self._linestyle = other._linestyle
         self._marker = other._marker
+        self._markerFunc = other._markerFunc
         self._drawstyle = other._drawstyle
 
 

Modified: trunk/matplotlib/lib/matplotlib/text.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/text.py     2009-12-31 15:48:55 UTC (rev 
8058)
+++ trunk/matplotlib/lib/matplotlib/text.py     2009-12-31 16:45:59 UTC (rev 
8059)
@@ -997,13 +997,10 @@
         """
         # Did we find an even number of non-escaped dollar signs?
         # If so, treat is as math text.
-        dollar_count = s.count(r'$') - s.count(r'\$')
-        even_dollars = (dollar_count > 0 and dollar_count % 2 == 0)
-
         if rcParams['text.usetex']:
             return s, 'TeX'
 
-        if even_dollars:
+        if cbook.is_math_text(s):
             return s, True
         else:
             return s.replace(r'\$', '$'), False

Modified: trunk/matplotlib/src/_path.cpp
===================================================================
--- trunk/matplotlib/src/_path.cpp      2009-12-31 15:48:55 UTC (rev 8058)
+++ trunk/matplotlib/src/_path.cpp      2009-12-31 16:45:59 UTC (rev 8059)
@@ -922,9 +922,13 @@
         vertices = (PyArrayObject*)PyArray_FromObject
                    (vertices_obj.ptr(), PyArray_DOUBLE, 1, 2);
         if (!vertices ||
-            (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 1) != 2) ||
-            (PyArray_NDIM(vertices) == 1 && PyArray_DIM(vertices, 0) != 2))
+            (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 0) != 0 &&
+             PyArray_DIM(vertices, 1) != 2) ||
+            (PyArray_NDIM(vertices) == 1 &&
+             PyArray_DIM(vertices, 0) != 2 && PyArray_DIM(vertices, 0) != 0))
+        {
             throw Py::ValueError("Invalid vertices array.");
+        }
 
         transform = (PyArrayObject*) PyArray_FromObject
                     (transform_obj.ptr(), PyArray_DOUBLE, 2, 2);
@@ -979,7 +983,7 @@
                 vertex_in += stride0;
             }
         }
-        else
+        else if (PyArray_DIM(vertices, 0) != 0)
         {
             char* vertex_in = PyArray_BYTES(vertices);
             double* vertex_out = (double*)PyArray_DATA(result);


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to