Revision: 4603
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4603&view=rev
Author:   mdboom
Date:     2007-12-04 13:33:33 -0800 (Tue, 04 Dec 2007)

Log Message:
-----------
Add experimental support for auto-layout of axes on the figure, to
prevent ticks and labels from overlapping things in other axes.

Modified Paths:
--------------
    branches/transforms/examples/backend_driver.py
    branches/transforms/examples/colorbar_only.py
    branches/transforms/examples/figlegend_demo.py
    branches/transforms/examples/finance_demo.py
    branches/transforms/examples/mathtext_demo.py
    branches/transforms/examples/simple_plot.py
    branches/transforms/lib/matplotlib/axes.py
    branches/transforms/lib/matplotlib/axis.py
    branches/transforms/lib/matplotlib/figure.py
    branches/transforms/lib/matplotlib/projections/polar.py
    branches/transforms/lib/matplotlib/rcsetup.py

Added Paths:
-----------
    branches/transforms/examples/auto_layout.py

Added: branches/transforms/examples/auto_layout.py
===================================================================
--- branches/transforms/examples/auto_layout.py                         (rev 0)
+++ branches/transforms/examples/auto_layout.py 2007-12-04 21:33:33 UTC (rev 
4603)
@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+"""
+Example: simple line plot.
+Show how to make and save a simple line plot with labels, title and grid
+"""
+from pylab import *
+
+t = arange(0.0, 1.0+0.01, 0.01)
+s = cos(2*2*pi*t)
+ax1 = subplot(211)
+plot(t, s, '-', lw=2)
+
+xlabel('xlabel for bottom axes')
+ylabel('ylabel on the right')
+title('About as simple as it gets, folks')
+grid(True)
+ax1.yaxis.set_label_position('right')
+ax1.xaxis.set_ticklabels(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 
'Friday'])
+for label in ax1.get_xticklabels():
+    label.set_rotation(45)
+
+ax2 = subplot(212)
+plot(t, s, '-', lw=2)
+grid(True)
+xlabel('xlabel for bottom axes (the ticks are on the top for no good reason)')
+ylabel('I\'m a lefty')
+ax2.xaxis.set_label_position('bottom')
+ax2.xaxis.set_ticks_position('top')
+
+
+#savefig('simple_plot.png')
+savefig('simple_plot')
+
+show()


Property changes on: branches/transforms/examples/auto_layout.py
___________________________________________________________________
Name: svn:executable
   + *

Modified: branches/transforms/examples/backend_driver.py
===================================================================
--- branches/transforms/examples/backend_driver.py      2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/examples/backend_driver.py      2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -23,6 +23,7 @@
     'alignment_test.py',
     'arctest.py',
     'arrow_demo.py',
+    'auto_layout.py',
     'axes_demo.py',
     'axhspan_demo.py',
     'bar_stacked.py',
@@ -35,7 +36,7 @@
     'cohere_demo.py',
     'contour_demo.py',
     'contourf_demo.py',
-    'csd_demo.py',    
+    'csd_demo.py',
     'custom_ticker1.py',
     'customize_rc.py',
     'date_demo1.py',

Modified: branches/transforms/examples/colorbar_only.py
===================================================================
--- branches/transforms/examples/colorbar_only.py       2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/examples/colorbar_only.py       2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -7,7 +7,7 @@
 
 # Make a figure and axes with dimensions as desired.
 fig = pylab.figure(figsize=(8,1.5))
-ax = fig.add_axes([0.05, 0.4, 0.9, 0.5])
+ax = fig.add_axes([0.05, 0.05, 0.9, 0.9])
 
 # Set the colormap and norm to correspond to the data for which
 # the colorbar will be used.

Modified: branches/transforms/examples/figlegend_demo.py
===================================================================
--- branches/transforms/examples/figlegend_demo.py      2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/examples/figlegend_demo.py      2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 from pylab import *
-ax1 = axes([0.1, 0.1, 0.4, 0.7])
+ax1 = axes([0.05, 0.1, 0.4, 0.7])
 ax2 = axes([0.55, 0.1, 0.4, 0.7])
 
 x = arange(0.0, 2.0, 0.02)

Modified: branches/transforms/examples/finance_demo.py
===================================================================
--- branches/transforms/examples/finance_demo.py        2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/examples/finance_demo.py        2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -22,7 +22,7 @@
     raise SystemExit
 
 fig = figure()
-fig.subplots_adjust(bottom=0.2)
+# fig.subplots_adjust(bottom=0.2)
 ax = fig.add_subplot(111)
 ax.xaxis.set_major_locator(mondays)
 ax.xaxis.set_minor_locator(alldays)

Modified: branches/transforms/examples/mathtext_demo.py
===================================================================
--- branches/transforms/examples/mathtext_demo.py       2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/examples/mathtext_demo.py       2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -7,7 +7,7 @@
 from matplotlib.pyplot import figure, show
 
 fig = figure()
-fig.subplots_adjust(bottom=0.2)
+# fig.subplots_adjust(bottom=0.2)
 
 ax = fig.add_subplot(111, axisbg='y')
 ax.plot([1,2,3], 'r')

Modified: branches/transforms/examples/simple_plot.py
===================================================================
--- branches/transforms/examples/simple_plot.py 2007-12-04 21:30:06 UTC (rev 
4602)
+++ branches/transforms/examples/simple_plot.py 2007-12-04 21:33:33 UTC (rev 
4603)
@@ -13,6 +13,9 @@
 ylabel('voltage (mV)')
 title('About as simple as it gets, folks')
 grid(True)
+axes().xaxis.set_label_position('top')
+axes().xaxis.set_ticks_position('top')
+axes().yaxis.set_label_position('right')
 
 #savefig('simple_plot.png')
 savefig('simple_plot')

Modified: branches/transforms/lib/matplotlib/axes.py
===================================================================
--- branches/transforms/lib/matplotlib/axes.py  2007-12-04 21:30:06 UTC (rev 
4602)
+++ branches/transforms/lib/matplotlib/axes.py  2007-12-04 21:33:33 UTC (rev 
4603)
@@ -770,13 +770,14 @@
 
         self.grid(self._gridOn)
         props = font_manager.FontProperties(size=rcParams['axes.titlesize'])
+        self.titleOffsetTrans = mtransforms.Affine2D().translate(0.0, 10.0)
         self.title =  mtext.Text(
-            x=0.5, y=1.02, text='',
+            x=0.5, y=1.0, text='',
             fontproperties=props,
             verticalalignment='bottom',
             horizontalalignment='center',
             )
-        self.title.set_transform(self.transAxes)
+        self.title.set_transform(self.transAxes + self.titleOffsetTrans)
         self.title.set_clip_box(None)
 
         self._set_artist_props(self.title)
@@ -800,6 +801,8 @@
         self.xaxis.set_clip_path(self.axesPatch)
         self.yaxis.set_clip_path(self.axesPatch)
 
+        self.titleOffsetTrans.clear()
+
     def clear(self):
         'clear the axes'
         self.cla()
@@ -905,14 +908,14 @@
         ysize = max(math.fabs(ymax-ymin), 1e-30)
         return ysize/xsize
 
-    def apply_aspect(self):
+    def apply_aspect(self, position):
         '''
         Use self._aspect and self._adjustable to modify the
         axes box or the view limits.
         '''
         aspect = self.get_aspect()
         if aspect == 'auto':
-            self.set_position( self._originalPosition , 'active')
+            self.set_position( position , 'active')
             return
 
         if aspect == 'equal':
@@ -929,7 +932,7 @@
         fig_aspect = figH/figW
         if self._adjustable == 'box':
             box_aspect = A * self.get_data_ratio()
-            pb = self._originalPosition.frozen()
+            pb = position.frozen()
             pb1 = pb.shrunk_to_aspect(box_aspect, pb, fig_aspect)
             self.set_position(pb1.anchored(self.get_anchor(), pb), 'active')
             return
@@ -939,7 +942,7 @@
         ymin,ymax = self.get_ybound()
         ysize = max(math.fabs(ymax-ymin), 1e-30)
 
-        l,b,w,h = self.get_position(original=True).bounds
+        l,b,w,h = position.bounds
         box_aspect = fig_aspect * (h/w)
         data_ratio = box_aspect / A
 
@@ -1014,7 +1017,7 @@
                 self.set_autoscale_on(True)
                 self.set_aspect('auto')
                 self.autoscale_view()
-                self.apply_aspect()
+                # self.apply_aspect()
                 if s=='equal':
                     self.set_aspect('equal', adjustable='datalim')
                 elif s == 'scaled':
@@ -1289,6 +1292,32 @@
             YL = ylocator.autoscale()
             self.set_ybound(YL)
 
+    def update_layout(self, renderer):
+        pad_pixels = rcParams['xtick.major.pad'] * self.figure.dpi / 72.0
+        inverse_transFigure = self.figure.transFigure.inverted()
+        t_text, b_text = self.xaxis.get_text_heights(renderer)
+        l_text, r_text = self.yaxis.get_text_widths(renderer)
+        title_height = self.title.get_window_extent(renderer).height
+        title_height += pad_pixels * 2.0
+        original_t_text = t_text
+
+        ((l_text, t_text),
+         (r_text, b_text),
+         (dummy, title_height)) = inverse_transFigure.transform(
+            ((l_text, t_text),
+             (r_text, b_text),
+             (0.0, title_height)))
+        x0, y0, x1, y1 = self.get_position(True).extents
+        # Adjust the title
+        self.titleOffsetTrans.clear().translate(
+            0, original_t_text + pad_pixels * 2.0)
+
+        new_position = mtransforms.Bbox.from_extents(
+            x0 + l_text, y0 + b_text,
+            x1 - r_text, y1 - t_text - title_height)
+
+        self.set_position(new_position, 'active')
+
     #### Drawing
     def draw(self, renderer=None, inframe=False):
         "Draw everything (plot lines, axes, labels)"
@@ -1299,8 +1328,9 @@
             raise RuntimeError('No renderer defined')
         if not self.get_visible(): return
         renderer.open_group('axes')
-        self.apply_aspect()
 
+        self.apply_aspect(self.get_position())
+
         if self.axison and self._frameon:
             self.axesPatch.draw(renderer)
 

Modified: branches/transforms/lib/matplotlib/axis.py
===================================================================
--- branches/transforms/lib/matplotlib/axis.py  2007-12-04 21:30:06 UTC (rev 
4602)
+++ branches/transforms/lib/matplotlib/axis.py  2007-12-04 21:33:33 UTC (rev 
4603)
@@ -130,11 +130,11 @@
 
         ACCEPTS: float
         """
-        self._pad.set(val)
+        self._pad = val
 
     def get_pad(self, val):
         'Get the value of the tick label pad in points'
-        return self._pad.get()
+        return self._pad
 
     def _get_text1(self):
         'Get the default Text 1 instance'
@@ -578,30 +578,43 @@
         if a is None: return
         a.set_figure(self.figure)
 
-    def draw(self, renderer, *args, **kwargs):
-        'Draw the axis lines, grid lines, tick lines and labels'
-        if not self.get_visible(): return
-        renderer.open_group(__name__)
-        ticklabelBoxes = []
-        ticklabelBoxes2 = []
-
+    def iter_ticks(self):
+        """
+        Iterate through all of the major and minor ticks.
+        """
         majorLocs = self.major.locator()
         majorTicks = self.get_major_ticks(len(majorLocs))
         self.major.formatter.set_locs(majorLocs)
         majorLabels = [self.major.formatter(val, i) for i, val in 
enumerate(majorLocs)]
 
+        minorLocs = self.minor.locator()
+        minorTicks = self.get_minor_ticks(len(minorLocs))
+        self.minor.formatter.set_locs(minorLocs)
+        minorLabels = [self.minor.formatter(val, i) for i, val in 
enumerate(minorLocs)]
 
-        seen = {}
+        major_minor = [
+            (majorTicks, majorLocs, majorLabels),
+            (minorTicks, minorLocs, minorLabels)]
 
+        for group in major_minor:
+            for tick in zip(*group):
+                yield tick
+
+    def get_ticklabel_extents(self, renderer):
+        """
+        Get the extents of the tick labels on either side
+        of the axes.
+        """
+        ticklabelBoxes = []
+        ticklabelBoxes2 = []
+
         interval = self.get_view_interval()
-        for tick, loc, label in zip(majorTicks, majorLocs, majorLabels):
+        for tick, loc, label in self.iter_ticks():
             if tick is None: continue
             if not interval_contains(interval, loc): continue
-            seen[loc] = 1
             tick.update_position(loc)
             tick.set_label1(label)
             tick.set_label2(label)
-            tick.draw(renderer)
             if tick.label1On and tick.label1.get_visible():
                 extent = tick.label1.get_window_extent(renderer)
                 ticklabelBoxes.append(extent)
@@ -609,19 +622,30 @@
                 extent = tick.label2.get_window_extent(renderer)
                 ticklabelBoxes2.append(extent)
 
-        minorLocs = self.minor.locator()
-        minorTicks = self.get_minor_ticks(len(minorLocs))
-        self.minor.formatter.set_locs(minorLocs)
-        minorLabels = [self.minor.formatter(val, i) for i, val in 
enumerate(minorLocs)]
+        if len(ticklabelBoxes):
+            bbox = Bbox.union(ticklabelBoxes)
+        else:
+            bbox = Bbox.from_extents(0, 0, 0, 0)
+        if len(ticklabelBoxes2):
+            bbox2 = Bbox.union(ticklabelBoxes2)
+        else:
+            bbox2 = Bbox.from_extents(0, 0, 0, 0)
+        return bbox, bbox2
 
-        for tick, loc, label in zip(minorTicks, minorLocs, minorLabels):
+    def draw(self, renderer, *args, **kwargs):
+        'Draw the axis lines, grid lines, tick lines and labels'
+        ticklabelBoxes = []
+        ticklabelBoxes2 = []
+
+        if not self.get_visible(): return
+        renderer.open_group(__name__)
+        interval = self.get_view_interval()
+        for tick, loc, label in self.iter_ticks():
             if tick is None: continue
             if not interval_contains(interval, loc): continue
-            #if seen.has_key(loc): continue
             tick.update_position(loc)
             tick.set_label1(label)
             tick.set_label2(label)
-
             tick.draw(renderer)
             if tick.label1On and tick.label1.get_visible():
                 extent = tick.label1.get_window_extent(renderer)
@@ -1142,6 +1166,28 @@
             bottom = bbox.y0
         self.offsetText.set_position((x, 
bottom-self.OFFSETTEXTPAD*self.figure.dpi/72.0))
 
+    def get_text_heights(self, renderer):
+        """
+        Returns the amount of space one should reserve for text
+        above and below the axes.  Returns a tuple (above, below)
+        """
+        bbox, bbox2 = self.get_ticklabel_extents(renderer)
+        # MGDTODO: Need a better way to get the pad
+        padPixels = self.majorTicks[0]._padPixels
+
+        above = 0.0
+        if bbox2.height:
+            above += bbox2.height + padPixels
+        below = 0.0
+        if bbox.height:
+            below += bbox.height + padPixels
+
+        if self.get_label_position() == 'top':
+            above += self.label.get_window_extent(renderer).height + padPixels
+        else:
+            below += self.label.get_window_extent(renderer).height + padPixels
+        return above, below
+
     def set_ticks_position(self, position):
         """
         Set the ticks position (top, bottom, both, default or none)
@@ -1360,6 +1406,24 @@
         self.offsetText.set_ha(position)
         self.offsetText.set_position((x,y))
 
+    def get_text_widths(self, renderer):
+        bbox, bbox2 = self.get_ticklabel_extents(renderer)
+        # MGDTODO: Need a better way to get the pad
+        padPixels = self.majorTicks[0]._padPixels
+
+        left = 0.0
+        if bbox.width:
+            left += bbox.width + padPixels
+        right = 0.0
+        if bbox2.width:
+            right += bbox2.width + padPixels
+
+        if self.get_label_position() == 'left':
+            left += self.label.get_window_extent(renderer).width + padPixels
+        else:
+            right += self.label.get_window_extent(renderer).width + padPixels
+        return left, right
+
     def set_ticks_position(self, position):
         """
         Set the ticks position (left, right, both or default)

Modified: branches/transforms/lib/matplotlib/figure.py
===================================================================
--- branches/transforms/lib/matplotlib/figure.py        2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/lib/matplotlib/figure.py        2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -6,7 +6,7 @@
 import artist
 from artist import Artist
 from axes import Axes, SubplotBase, subplot_class_factory
-from cbook import flatten, allequal, Stack, iterable, dedent
+from cbook import flatten, allequal, Stack, iterable, dedent, set
 import _image
 import colorbar as cbar
 from image import FigureImage
@@ -100,7 +100,7 @@
 
     def __str__(self):
         return "Figure(%gx%g)" % tuple(self.bbox.size)
-    
+
     def __init__(self,
                  figsize   = None,  # defaults to rc figure.figsize
                  dpi       = None,  # defaults to rc figure.dpi
@@ -126,7 +126,7 @@
         self.dpi = dpi
        self.bbox_inches = Bbox.from_bounds(0, 0, *figsize)
        self.bbox = TransformedBbox(self.bbox_inches, self._dpi_scale_trans)
-       
+
         self.frameon = frameon
 
         self.transFigure = BboxTransformTo(self.bbox)
@@ -158,7 +158,7 @@
        self._dpi = dpi
        self._dpi_scale_trans.clear().scale(dpi, dpi)
     dpi = property(_get_dpi, _set_dpi)
-       
+
     def autofmt_xdate(self, bottom=0.2, rotation=30, ha='right'):
         """
         A common use case is a number of subplots with shared xaxes
@@ -181,7 +181,7 @@
             else:
                 for label in ax.get_xticklabels():
                     label.set_visible(False)
-        self.subplots_adjust(bottom=bottom)
+        #self.subplots_adjust(bottom=bottom)
 
     def get_children(self):
         'get a list of artists contained in the figure'
@@ -322,7 +322,7 @@
 
        dpival = self.dpi
        self.bbox_inches.p1 = w, h
-       
+
         if forward:
             dpival = self.dpi
             canvasw = w*dpival
@@ -389,7 +389,7 @@
         ACCEPTS: float
         """
        self.bbox_inches.x1 = val
-       
+
     def set_figheight(self, val):
         """
         Set the height of the figure in inches
@@ -448,7 +448,7 @@
         provided, which is equivalent to projection='polar').
         Valid values for "projection" are: %s.  Some of these projections
         support additional kwargs, which may be provided to add_axes.
-        
+
             rect = l,b,w,h
             add_axes(rect)
             add_axes(rect, frameon=False, axisbg='g')
@@ -469,7 +469,7 @@
             add_axes(rect, label='axes2')
 
         The Axes instance will be returned
-        
+
         The following kwargs are supported:
         %s
         """ % (", ".join(get_projection_names()), '%(Axes)s')
@@ -496,7 +496,7 @@
                         "Only one of these arguments should be supplied." %
                         projection)
                 projection = 'polar'
-            
+
             a = projection_factory(projection, self, rect, **kwargs)
 
         self.axes.append(a)
@@ -524,7 +524,7 @@
         be provided to add_axes.
 
         The Axes instance will be returned.
-        
+
         If the figure already has a subplot with key *args, *kwargs then it 
will
         simply make that subplot current and return it
 
@@ -623,7 +623,40 @@
             renderer.draw_image(l, b, im, self.bbox,
                                 *self.get_transformed_clip_path_and_affine())
 
+        # update the positions of the axes
+        # This gives each of the axes the opportunity to resize itself
+        # based on the tick and axis labels etc., and then makes sure
+        # that any axes that began life aligned to another axes remains
+        # aligned after these adjustments
+        if len(self.axes) > 1:
+            aligned_positions = [{}, {}, {}, {}]
+            for a in self.axes:
+                a.update_layout(renderer)
+                orig_pos = a.get_position(True)
+                curr_pos = a.get_position()
+                for pos, orig, curr in zip(aligned_positions,
+                                           orig_pos.get_points().flatten(),
+                                           curr_pos.get_points().flatten()):
+                    if orig in pos:
+                        pos[orig][0].append(a)
+                        pos[orig][1].add(curr)
+                    else:
+                        pos[orig] = [[a], set([curr])]
 
+            for i, pos in enumerate(aligned_positions):
+                for axes, places in pos.values():
+                    if len(places) > 1:
+                        if i < 2:
+                            curr = max(places)
+                        else:
+                            curr = min(places)
+                        for a in axes:
+                            curr_pos = a.get_position().frozen()
+                            curr_pos.get_points()[i/2, i%2] = curr
+                            a.set_position(curr_pos, 'active')
+        else:
+            for a in self.axes: a.update_layout(renderer)
+
         # render the axes
         for a in self.axes: a.draw(renderer)
 

Modified: branches/transforms/lib/matplotlib/projections/polar.py
===================================================================
--- branches/transforms/lib/matplotlib/projections/polar.py     2007-12-04 
21:30:06 UTC (rev 4602)
+++ branches/transforms/lib/matplotlib/projections/polar.py     2007-12-04 
21:33:33 UTC (rev 4603)
@@ -20,7 +20,7 @@
     Theta starts pointing east and goes anti-clockwise.
     """
     name = 'polar'
-    
+
     class PolarTransform(Transform):
         """
         The base polar transform.  This handles projection theta and r into
@@ -61,10 +61,10 @@
             ipath = path.interpolated(self._resolution)
             return Path(self.transform(ipath.vertices), ipath.codes)
         transform_path.__doc__ = Transform.transform_path.__doc__
-        
+
         transform_path_non_affine = transform_path
         transform_path_non_affine.__doc__ = 
Transform.transform_path_non_affine.__doc__
-        
+
         def inverted(self):
             return PolarAxes.InvertedPolarTransform()
         inverted.__doc__ = Transform.inverted.__doc__
@@ -95,7 +95,7 @@
                 self._invalid = 0
             return self._mtx
         get_matrix.__doc__ = Affine2DBase.get_matrix.__doc__
-    
+
     class InvertedPolarTransform(Transform):
         """
         The inverse of the polar transform, mapping Cartesian
@@ -130,7 +130,7 @@
     class RadialLocator(Locator):
         """
         Used to locate radius ticks.
-        
+
         Ensures that all ticks are strictly positive.  For all other
         tasks, it delegates to the base Locator (which may be
         different depending on the scale of the r-axis.
@@ -155,12 +155,12 @@
             return self.base.refresh()
 
     RESOLUTION = 75
-        
+
     def __init__(self, *args, **kwargs):
         """
         Create a new Polar Axes for a polar plot.
         """
-        
+
         self._rpad = 0.05
         Axes.__init__(self, *args, **kwargs)
         self.set_aspect('equal', adjustable='box', anchor='C')
@@ -179,8 +179,6 @@
         self.xaxis.set_ticks_position('none')
         self.yaxis.set_ticks_position('none')
 
-        self.title.set_y(1.06)
-        
     def _set_lim_and_transforms(self):
        self.dataLim = Bbox.unit()
         self.viewLim = Bbox.unit()
@@ -239,9 +237,17 @@
             self._yaxis_transform
             )
 
+    def update_layout(self, renderer):
+        t_text, b_text = self.xaxis.get_text_heights(renderer)
+        l_text, r_text = self.yaxis.get_text_widths(renderer)
+        originalPosition = self.get_position(True)
+        title_offset = (b_text - originalPosition.transformed(
+                self.figure.transFigure).height) / 2.0
+        self.titleOffsetTrans.clear().translate(0, title_offset)
+
     def get_xaxis_transform(self):
         return self._xaxis_transform
-        
+
     def get_xaxis_text1_transform(self, pixelPad):
         return self._xaxis_text1_transform, 'center', 'center'
 
@@ -250,16 +256,16 @@
 
     def get_yaxis_transform(self):
         return self._yaxis_transform
-    
+
     def get_yaxis_text1_transform(self, pixelPad):
         return self._yaxis_text1_transform, 'center', 'center'
 
     def get_yaxis_text2_transform(self, pixelPad):
         return self._yaxis_text2_transform, 'center', 'center'
-    
+
     def get_axes_patch(self):
         return Circle((0.5, 0.5), 0.5)
-            
+
     def set_rmax(self, rmax):
         self.viewLim.y1 = rmax
         angle = self._r_label1_position.to_values()[4]
@@ -275,7 +281,7 @@
         Axes.set_yscale(self, *args, **kwargs)
         self.yaxis.set_major_locator(
             self.RadialLocator(self.yaxis.get_major_locator()))
-    
+
     set_rscale = Axes.set_yscale
     set_rticks = Axes.set_yticks
 
@@ -313,7 +319,7 @@
         for t in self.xaxis.get_ticklabels():
             t.update(kwargs)
     set_thetagrids.__doc__ = cbook.dedent(set_thetagrids.__doc__) % kwdocd
-    
+
     def set_rgrids(self, radii, labels=None, angle=None, rpad=None, **kwargs):
         """
         set the radial locations and labels of the r grids
@@ -354,9 +360,9 @@
         self._r_label2_position.clear().translate(angle, -self._rpad * rmax)
         for t in self.yaxis.get_ticklabels():
             t.update(kwargs)
-        
+
     set_rgrids.__doc__ = cbook.dedent(set_rgrids.__doc__) % kwdocd
-    
+
     def set_xscale(self, scale, *args, **kwargs):
         if scale != 'linear':
             raise NotImplementedError("You can not set the xscale on a polar 
plot.")
@@ -364,7 +370,7 @@
     def set_xlim(self, *args, **kargs):
         # The xlim is fixed, no matter what you do
         self.viewLim.intervalx = (0.0, npy.pi * 2.0)
-    
+
     def format_coord(self, theta, r):
         'return a format string formatting the coordinate'
         theta /= math.pi
@@ -387,7 +393,7 @@
         Return True if this axes support the zoom box
         """
         return False
-    
+
     def start_pan(self, x, y, button):
         angle = self._r_label1_position.to_values()[4] / 180.0 * npy.pi
         mode = ''
@@ -398,7 +404,7 @@
                 mode = 'drag_r_labels'
         elif button == 3:
             mode = 'zoom'
-            
+
         self._pan_start = cbook.Bunch(
             rmax          = self.get_rmax(),
             trans         = self.transData.frozen(),
@@ -411,14 +417,14 @@
 
     def end_pan(self):
         del self._pan_start
-                                       
+
     def drag_pan(self, button, key, x, y):
         p = self._pan_start
-        
+
         if p.mode == 'drag_r_labels':
             startt, startr = p.trans_inverse.transform_point((p.x, p.y))
             t, r = p.trans_inverse.transform_point((x, y))
-            
+
             # Deal with theta
             dt0 = t - startt
             dt1 = startt - t
@@ -433,24 +439,24 @@
                 p.r_label_angle - dt, rpad)
             self._r_label2_position.clear().translate(
                 p.r_label_angle - dt, -rpad)
-            
+
         elif p.mode == 'zoom':
             startt, startr = p.trans_inverse.transform_point((p.x, p.y))
             t, r = p.trans_inverse.transform_point((x, y))
-            
+
             dr = r - startr
 
             # Deal with r
             scale = r / startr
             self.set_rmax(p.rmax / scale)
-    
+
 # These are a couple of aborted attempts to project a polar plot using
 # cubic bezier curves.
-        
+
 #         def transform_path(self, path):
 #             twopi = 2.0 * npy.pi
 #             halfpi = 0.5 * npy.pi
-            
+
 #             vertices = path.vertices
 #             t0 = vertices[0:-1, 0]
 #             t1 = vertices[1:  , 0]
@@ -469,7 +475,7 @@
 
 #             kappa = 4.0 * ((npy.sqrt(2.0) - 1.0) / 3.0)
 #             kappa = 0.5
-            
+
 #             p0   = vertices[0:-1]
 #             p1   = vertices[1:  ]
 
@@ -497,17 +503,17 @@
 
 #             result[2::3, 0:1] = xk
 #             result[2::3, 1: ] = yk
-            
+
 #             result[3::3] = p1
 
 #             print vertices[-2:]
 #             print result[-2:]
-            
+
 #             return mpath.Path(result, codes)
-            
+
 #             twopi = 2.0 * npy.pi
 #             halfpi = 0.5 * npy.pi
-            
+
 #             vertices = path.vertices
 #             t0 = vertices[0:-1, 0]
 #             t1 = vertices[1:  , 0]
@@ -518,7 +524,7 @@
 #             print "interpolate", interpolate
 #             if interpolate > 1.0:
 #                 vertices = self.interpolate(vertices, interpolate)
-            
+
 #             result = npy.zeros((len(vertices) * 3 - 2, 2), npy.float_)
 #             codes = mpath.Path.CURVE4 * npy.ones((len(vertices) * 3 - 2, ), 
mpath.Path.code_type)
 #             result[0] = vertices[0]
@@ -547,7 +553,7 @@
 #             result[2::3, 0] = t1 - (tkappa * td_scaled)
 #             result[2::3, 1] = r1*hyp_kappa
 #             # result[2::3, 1] = r1 / npy.cos(tkappa * td_scaled) # 
npy.sqrt(r1*r1 + ravg_kappa*ravg_kappa)
-            
+
 #             result[3::3, 0] = t1
 #             result[3::3, 1] = r1
 
@@ -556,4 +562,4 @@
 #             return mpath.Path(result, codes)
 #         transform_path_non_affine = transform_path
 
-        
+

Modified: branches/transforms/lib/matplotlib/rcsetup.py
===================================================================
--- branches/transforms/lib/matplotlib/rcsetup.py       2007-12-04 21:30:06 UTC 
(rev 4602)
+++ branches/transforms/lib/matplotlib/rcsetup.py       2007-12-04 21:33:33 UTC 
(rev 4603)
@@ -143,7 +143,7 @@
 
     if len(s)==6 and s.isalnum(): # looks like hex
         return '#' + s
-    
+
     if len(s)==7 and s.startswith('#') and s[1:].isalnum():
         return s
 
@@ -198,7 +198,7 @@
         return float(s)
     except ValueError:
         raise ValueError('not a valid font size')
-    
+
 def validate_font_properties(s):
     parse_fontconfig_pattern(s)
     return s
@@ -369,7 +369,7 @@
     'mathtext.sf'         : ['sans\-serif', validate_font_properties],
     'mathtext.fontset'    : ['cm', validate_fontset],
     'mathtext.fallback_to_cm' : [True, validate_bool],
-    
+
     'image.aspect'        : ['equal', validate_aspect],  # equal, auto, a 
number
     'image.interpolation' : ['bilinear', str],
     'image.cmap'          : ['jet', str],        # one of gray, jet, etc
@@ -440,12 +440,12 @@
     'figure.facecolor'  : [ '0.75', validate_color], # facecolor; scalar gray
     'figure.edgecolor'  : [ 'w', validate_color],  # edgecolor; white
 
-    'figure.subplot.left'   : [0.125, ValidateInterval(0, 1, closedmin=False, 
closedmax=False)],
+    'figure.subplot.left'   : [0.1, ValidateInterval(0, 1, closedmin=False, 
closedmax=False)],
     'figure.subplot.right'  : [0.9, ValidateInterval(0, 1, closedmin=False, 
closedmax=False)],
     'figure.subplot.bottom' : [0.1, ValidateInterval(0, 1, closedmin=False, 
closedmax=False)],
     'figure.subplot.top'    : [0.9, ValidateInterval(0, 1, closedmin=False, 
closedmax=False)],
-    'figure.subplot.wspace' : [0.2, ValidateInterval(0, 1, closedmin=False, 
closedmax=True)],
-    'figure.subplot.hspace' : [0.2, ValidateInterval(0, 1, closedmin=False, 
closedmax=True)],
+    'figure.subplot.wspace' : [0.1, ValidateInterval(0, 1, closedmin=False, 
closedmax=True)],
+    'figure.subplot.hspace' : [0.1, ValidateInterval(0, 1, closedmin=False, 
closedmax=True)],
 
 
     'savefig.dpi'         : [100, validate_float],   # DPI


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

-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to