From: <md...@us...> - 2007-12-04 21:33:39
|
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. |