From: <lee...@us...> - 2009-05-12 04:12:11
|
Revision: 7098 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7098&view=rev Author: leejjoon Date: 2009-05-12 04:12:07 +0000 (Tue, 12 May 2009) Log Message: ----------- aspect for log-log plot Modified Paths: -------------- trunk/matplotlib/CHANGELOG trunk/matplotlib/lib/matplotlib/axes.py Added Paths: ----------- trunk/matplotlib/examples/pylab_examples/aspect_loglog.py Modified: trunk/matplotlib/CHANGELOG =================================================================== --- trunk/matplotlib/CHANGELOG 2009-05-08 19:04:34 UTC (rev 7097) +++ trunk/matplotlib/CHANGELOG 2009-05-12 04:12:07 UTC (rev 7098) @@ -1,4 +1,6 @@ ====================================================================== +2009-05-11 aspect=1 in log-log plot gives square decades. + 2009-05-08 clabel takes new kwarg, rightside_up; if False, labels will not be flipped to keep them rightside-up. This allows the use of clabel to make streamfunction arrows, Added: trunk/matplotlib/examples/pylab_examples/aspect_loglog.py =================================================================== --- trunk/matplotlib/examples/pylab_examples/aspect_loglog.py (rev 0) +++ trunk/matplotlib/examples/pylab_examples/aspect_loglog.py 2009-05-12 04:12:07 UTC (rev 7098) @@ -0,0 +1,22 @@ +import matplotlib.pyplot as plt + +ax1 = plt.subplot(121) +ax1.set_xscale("log") +ax1.set_yscale("log") +ax1.set_xlim(1e1, 1e3) +ax1.set_ylim(1e2, 1e3) +ax1.set_aspect(1) +ax1.set_title("adjustable = box") + +ax2 = plt.subplot(122) +ax2.set_xscale("log") +ax2.set_yscale("log") +ax2.set_adjustable("datalim") +ax2.plot([1,3, 10], [1, 9, 100], "o-") +ax2.set_xlim(1e-1, 1e2) +ax2.set_ylim(1e-1, 1e3) +ax2.set_aspect(1) +ax2.set_title("adjustable = datalim") + +plt.draw() +plt.show() Modified: trunk/matplotlib/lib/matplotlib/axes.py =================================================================== --- trunk/matplotlib/lib/matplotlib/axes.py 2009-05-08 19:04:34 UTC (rev 7097) +++ trunk/matplotlib/lib/matplotlib/axes.py 2009-05-12 04:12:07 UTC (rev 7098) @@ -1085,7 +1085,7 @@ raise ValueError('argument must be among %s' % ', '.join(mtransforms.BBox.coefs.keys())) - def get_data_ratio(self): + def get_data_ratio(self, mode="linear"): """ Returns the aspect ratio of the raw data. @@ -1093,11 +1093,18 @@ types. """ xmin,xmax = self.get_xbound() - xsize = max(math.fabs(xmax-xmin), 1e-30) ymin,ymax = self.get_ybound() - ysize = max(math.fabs(ymax-ymin), 1e-30) + + if mode == "log": + xsize = max(math.fabs(math.log10(xmax)-math.log10(xmin)), 1e-30) + ysize = max(math.fabs(math.log10(ymax)-math.log10(ymin)), 1e-30) + else: + xsize = max(math.fabs(xmax-xmin), 1e-30) + ysize = max(math.fabs(ymax-ymin), 1e-30) + return ysize/xsize + def apply_aspect(self, position=None): ''' Use :meth:`_aspect` and :meth:`_adjustable` to modify the @@ -1106,7 +1113,20 @@ if position is None: position = self.get_position(original=True) + aspect = self.get_aspect() + + xscale, yscale = self.get_xscale(), self.get_yscale() + if xscale == "linear" and yscale == "linear": + aspect_scale_mode = "linear" + elif xscale == "log" and yscale == "log": + aspect_scale_mode = "log" + else: + warnings.warn( + 'aspect is not supported for Axes with xscale=%s, yscale=%s' \ + % (xscale, yscale)) + aspect = "auto" + if aspect == 'auto': self.set_position( position , which='active') return @@ -1127,7 +1147,7 @@ figW,figH = self.get_figure().get_size_inches() fig_aspect = figH/figW if self._adjustable == 'box': - box_aspect = A * self.get_data_ratio() + box_aspect = A * self.get_data_ratio(mode=aspect_scale_mode) pb = position.frozen() pb1 = pb.shrunk_to_aspect(box_aspect, pb, fig_aspect) self.set_position(pb1.anchored(self.get_anchor(), pb), 'active') @@ -1137,11 +1157,18 @@ # by prior use of 'box' self.set_position(position, which='active') + xmin,xmax = self.get_xbound() + ymin,ymax = self.get_ybound() + + if aspect_scale_mode == "log": + xmin, xmax = math.log10(xmin), math.log10(xmax) + ymin, ymax = math.log10(ymin), math.log10(ymax) + xsize = max(math.fabs(xmax-xmin), 1e-30) - ymin,ymax = self.get_ybound() ysize = max(math.fabs(ymax-ymin), 1e-30) + l,b,w,h = position.bounds box_aspect = fig_aspect * (h/w) data_ratio = box_aspect / A @@ -1152,9 +1179,18 @@ if abs(y_expander) < 0.005: #print 'good enough already' return - dL = self.dataLim - xr = 1.05 * dL.width - yr = 1.05 * dL.height + + if aspect_scale_mode == "log": + dL = self.dataLim + dL_width = math.log10(dL.x1) - math.log10(dL.x0) + dL_height = math.log10(dL.y1) - math.log10(dL.y0) + xr = 1.05 * dL_width + yr = 1.05 * dL_height + else: + dL = self.dataLim + xr = 1.05 * dL.width + yr = 1.05 * dL.height + xmarg = xsize - xr ymarg = ysize - yr Ysize = data_ratio * xsize @@ -1189,14 +1225,20 @@ yc = 0.5*(ymin+ymax) y0 = yc - Ysize/2.0 y1 = yc + Ysize/2.0 - self.set_ybound((y0, y1)) + if aspect_scale_mode == "log": + self.set_ybound((10.**y0, 10.**y1)) + else: + self.set_ybound((y0, y1)) #print 'New y0, y1:', y0, y1 #print 'New ysize, ysize/xsize', y1-y0, (y1-y0)/xsize else: xc = 0.5*(xmin+xmax) x0 = xc - Xsize/2.0 x1 = xc + Xsize/2.0 - self.set_xbound((x0, x1)) + if aspect_scale_mode == "log": + self.set_xbound((10.**x0, 10.**x1)) + else: + self.set_xbound((x0, x1)) #print 'New x0, x1:', x0, x1 #print 'New xsize, ysize/xsize', x1-x0, ysize/(x1-x0) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |