Revision: 8034
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8034&view=rev
Author:   astraw
Date:     2009-12-15 02:57:46 +0000 (Tue, 15 Dec 2009)

Log Message:
-----------
Add patch_artist kwarg to boxplot

Modified Paths:
--------------
    trunk/matplotlib/CHANGELOG
    trunk/matplotlib/examples/pylab_examples/boxplot_demo2.py
    trunk/matplotlib/lib/matplotlib/axes.py
    trunk/matplotlib/lib/matplotlib/pyplot.py

Modified: trunk/matplotlib/CHANGELOG
===================================================================
--- trunk/matplotlib/CHANGELOG  2009-12-15 02:57:32 UTC (rev 8033)
+++ trunk/matplotlib/CHANGELOG  2009-12-15 02:57:46 UTC (rev 8034)
@@ -1,3 +1,6 @@
+2009-12-14 Add patch_artist kwarg to boxplot, but keep old default.
+           Convert boxplot_demo2.py to use the new patch_artist. - ADS
+
 2009-12-06 axes_grid: reimplemented AxisArtist with FloatingAxes support.
            Added new examples. - JJL
 

Modified: trunk/matplotlib/examples/pylab_examples/boxplot_demo2.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/boxplot_demo2.py   2009-12-15 
02:57:32 UTC (rev 8033)
+++ trunk/matplotlib/examples/pylab_examples/boxplot_demo2.py   2009-12-15 
02:57:46 UTC (rev 8034)
@@ -42,8 +42,8 @@
 ax1 = fig.add_subplot(111)
 plt.subplots_adjust(left=0.075, right=0.95, top=0.9, bottom=0.25)
 
-bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5)
-plt.setp(bp['boxes'], color='black')
+bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5, patch_artist=True)
+plt.setp(bp['boxes'], edgecolor='black')
 plt.setp(bp['whiskers'], color='black')
 plt.setp(bp['fliers'], color='red', marker='+')
 
@@ -64,25 +64,12 @@
 medians = range(numBoxes)
 for i in range(numBoxes):
   box = bp['boxes'][i]
-  boxX = []
-  boxY = []
-  for j in range(5):
-      boxX.append(box.get_xdata()[j])
-      boxY.append(box.get_ydata()[j])
-  boxCoords = zip(boxX,boxY)
-  # Alternate between Dark Khaki and Royal Blue
   k = i % 2
-  boxPolygon = Polygon(boxCoords, facecolor=boxColors[k])
-  ax1.add_patch(boxPolygon)
-  # Now draw the median lines back over what we just filled in
+  # Set the box colors
+  box.set_facecolor(boxColors[k])
+  # Now get the medians
   med = bp['medians'][i]
-  medianX = []
-  medianY = []
-  for j in range(2):
-      medianX.append(med.get_xdata()[j])
-      medianY.append(med.get_ydata()[j])
-      plt.plot(medianX, medianY, 'k')
-      medians[i] = medianY[0]
+  medians[i] = med.get_ydata()[0]
   # Finally, overplot the sample averages, with horixzontal alignment
   # in the center of each box
   plt.plot([np.average(med.get_xdata())], [np.average(data[i])],

Modified: trunk/matplotlib/lib/matplotlib/axes.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/axes.py     2009-12-15 02:57:32 UTC (rev 
8033)
+++ trunk/matplotlib/lib/matplotlib/axes.py     2009-12-15 02:57:46 UTC (rev 
8034)
@@ -21,6 +21,7 @@
 import matplotlib.legend as mlegend
 import matplotlib.lines as mlines
 import matplotlib.mlab as mlab
+import matplotlib.path as mpath
 import matplotlib.patches as mpatches
 import matplotlib.spines as mspines
 import matplotlib.quiver as mquiver
@@ -4892,12 +4893,12 @@
         return (l0, caplines, barcols)
 
     def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5,
-                positions=None, widths=None):
+                positions=None, widths=None, patch_artist=False):
         """
         call signature::
 
           boxplot(x, notch=0, sym='+', vert=1, whis=1.5,
-                  positions=None, widths=None)
+                  positions=None, widths=None, patch_artist=False)
 
         Make a box and whisker plot for each column of *x* or each
         vector in sequence *x*.  The box extends from the lower to
@@ -4905,6 +4906,8 @@
         The whiskers extend from the box to show the range of the
         data.  Flier points are those past the end of the whiskers.
 
+        *x* is an array or a sequence of vectors.
+
         - *notch* = 0 (default) produces a rectangular box plot.
         - *notch* = 1 will produce a notched box plot
 
@@ -4927,7 +4930,8 @@
         each box. The default is 0.5, or ``0.15*(distance between extreme
         positions)`` if that is smaller.
 
-        *x* is an array or a sequence of vectors.
+        - *patch_artist* = False (default) produces boxes with the Line2D 
artist
+        - *patch_artist* = True produces boxes with the Patch artist
 
         Returns a dictionary mapping each component of the boxplot
         to a list of the :class:`matplotlib.lines.Line2D`
@@ -5045,23 +5049,55 @@
                 med_x = [cap_x_min, cap_x_max]
                 med_y = [med, med]
 
+            def to_vc(xs,ys):
+                # convert arguments to verts and codes
+                verts = []
+                #codes = []
+                for xi,yi in zip(xs,ys):
+                    verts.append( (xi,yi) )
+                verts.append( (0,0) ) # ignored
+                codes = [mpath.Path.MOVETO] + \
+                        [mpath.Path.LINETO]*(len(verts)-2) + \
+                        [mpath.Path.CLOSEPOLY]
+                return verts,codes
+
+            def patch_list(xs,ys):
+                verts,codes = to_vc(xs,ys)
+                path = mpath.Path( verts, codes )
+                patch = mpatches.PathPatch(path)
+                self.add_artist(patch)
+                return [patch]
+
             # vertical or horizontal plot?
             if vert:
                 def doplot(*args):
                     return self.plot(*args)
+                def dopatch(xs,ys):
+                    return patch_list(xs,ys)
             else:
                 def doplot(*args):
                     shuffled = []
                     for i in xrange(0, len(args), 3):
                         shuffled.extend([args[i+1], args[i], args[i+2]])
                     return self.plot(*shuffled)
+                def dopatch(xs,ys):
+                    xs,ys = ys,xs # flip X, Y
+                    return patch_list(xs,ys)
 
+            if patch_artist:
+                median_color = 'k'
+            else:
+                median_color = 'r'
+
             whiskers.extend(doplot(wisk_x, [q1, wisk_lo], 'b--',
                                    wisk_x, [q3, wisk_hi], 'b--'))
             caps.extend(doplot(cap_x, [wisk_hi, wisk_hi], 'k-',
                                cap_x, [wisk_lo, wisk_lo], 'k-'))
-            boxes.extend(doplot(box_x, box_y, 'b-'))
-            medians.extend(doplot(med_x, med_y, 'r-'))
+            if patch_artist:
+                boxes.extend(dopatch(box_x, box_y))
+            else:
+                boxes.extend(doplot(box_x, box_y, 'b-'))
+            medians.extend(doplot(med_x, med_y, median_color+'-'))
             fliers.extend(doplot(flier_hi_x, flier_hi, sym,
                                  flier_lo_x, flier_lo, sym))
 

Modified: trunk/matplotlib/lib/matplotlib/pyplot.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/pyplot.py   2009-12-15 02:57:32 UTC (rev 
8033)
+++ trunk/matplotlib/lib/matplotlib/pyplot.py   2009-12-15 02:57:46 UTC (rev 
8034)
@@ -1767,7 +1767,8 @@
 # This function was autogenerated by boilerplate.py.  Do not edit as
 # changes will be lost
 @autogen_docstring(Axes.boxplot)
-def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, 
widths=None, hold=None):
+def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, 
widths=None,
+            hold=None, patch_artist=False):
     ax = gca()
     # allow callers to override the hold state by passing hold=True|False
     washold = ax.ishold()
@@ -1775,7 +1776,8 @@
     if hold is not None:
         ax.hold(hold)
     try:
-        ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths)
+        ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths,
+                         patch_artist=patch_artist)
         draw_if_interactive()
     finally:
         ax.hold(washold)


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

------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
Matplotlib-checkins mailing list
Matplotlib-checkins@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to