From: Darren D. <dd...@co...> - 2005-02-28 01:40:50
|
oops, I just noticed a bug, the first script I posted wont run. This updated script worked for me with a fresh 0.72.1 installation. Sorry about the error. Darren from matplotlib import * rc('font',size='smaller') rc('tick',labelsize='smaller') from matplotlib.ticker import ScalarFormatter, LinearLocator import math from matplotlib.numerix import absolute, average from pylab import * class ScalarFormatterScientific(ScalarFormatter): """ Tick location is a plain old number. If useOffset==True and the data range <1e-4* the data average, then an offset will be determined such that the tick labels are meaningful. Scientific notation is used for data < 1e-4 or data >= 1e4. Scientific notation is presented once for each axis, in the last ticklabel. """ def __init__(self, useOffset=True): """ useOffset allows plotting small data ranges with large offsets: for example: [1+1e-9,1+2e-9,1+3e-9] """ self._useOffset = useOffset self.offset = 0 self.orderOfMagnitude = 0 self.format = None def set_locs(self, locs): self.locs = locs self._set_offset() self._set_orderOfMagnitude() self._set_format() def _set_offset(self): # offset of 20,001 is 20,000, for example if self._useOffset: ave_loc = average(self.locs) std_loc = std(self.locs) if ave_loc: # dont want to take log10(0) ave_oom = math.floor(math.log10(absolute(ave_loc))) if std_loc/math.fabs(ave_loc) < 1e-4: # four sig-figs # add 1e-15 because of floating point precision, fixes conversion self.offset = int(ave_loc/10**ave_oom+1e-15)*10**ave_oom else: self.offset = 0 def _set_orderOfMagnitude(self): # if scientific notation is to be used, find the appropriate exponent # if using an offset, find the OOM after applying the offset locs = array(self.locs)-self.offset ave_loc_abs = average(absolute(locs)) oom = math.floor(math.log10(ave_loc_abs)) # need to special-case for range of 0-1e-5 if oom <= 0 and std(locs) < 1e-4:#10**(2*oom): self.orderOfMagnitude = oom elif oom <=0 and oom >= -5: pass elif math.fabs(oom) >= 4: self.orderOfMagnitude = oom def _set_format(self): # set the format string to format all the ticklabels locs = (array(self.locs,'d')-self.offset) / \ 10**self.orderOfMagnitude+1e-15 sigfigs = [len(str('%1.4f'% loc).split('.')[1].rstrip('0')) \ for loc in locs] sigfigs.sort() self.format = '%1.' + str(sigfigs[-1]) + 'f' def pprint_val(self, x, d): # d is no longer necessary, x is the tick location. xp = (x-self.offset)/10**self.orderOfMagnitude if x==self.locs[-1] and (self.orderOfMagnitude or self.offset): offsetStr = '' sciNotStr = '' xp = self.format % xp if self.offset: p = '%1.e+'% self.offset offsetStr = self._formatSciNotation(p) if self.orderOfMagnitude: p = 'x%1.e'% 10**self.orderOfMagnitude sciNotStr = self._formatSciNotation(p) return ''.join((offsetStr,xp,sciNotStr[2:])) elif xp==0: return '%d'% xp else: return self.format % xp def _formatSciNotation(self,s): # transform 1e+004 into 1e4, for example tup = s.split('e') mantissa = tup[0] sign = tup[1][0].replace('+', '') exponent = tup[1][1:].lstrip('0') return '%se%s%s' %(mantissa, sign, exponent) figure(1,figsize=(6,6)) ax1 = axes([.2,.74,.75,.2]) ax1.plot(arange(11)*5e2) ax1.yaxis.set_major_formatter(ScalarFormatterScientific()) ax1.xaxis.set_visible(False) ax1.set_title('BIG NUMBERS',fontsize=14) ax2 = axes([.2,.51,.75,.2]) ax2.plot(arange(11)*1e4) ax2.yaxis.set_major_formatter(ScalarFormatterScientific()) ax2.text(1,6e4,'y=1e4*x') ax2.xaxis.set_visible(False) ax3 = axes([.2,.28,.75,.2]) ax3.plot(arange(11)*1e4+1e10) ax3.yaxis.set_major_formatter(ScalarFormatterScientific()) ax3.text(1,6e4+1e10,'y=1e4*x+1e10') ax3.xaxis.set_visible(False) ax4 = axes([.2,.05,.75,.2]) ax4.plot(arange(11)*1e4+1e10) ax4.yaxis.set_major_formatter(ScalarFormatterScientific(useOffset=False)) ax4.text(1,1e10+6e4,'y=1e4*x+1e10, no offset') figure(2,figsize=(6,6)) ax1 = axes([.225,.74,.75,.2]) ax1.plot(arange(11)*1e-4) ax1.yaxis.set_major_formatter(ScalarFormatterScientific()) ax1.xaxis.set_visible(False) ax1.set_title('small numbers',fontsize=8) ax2 = axes([.225,.51,.75,.2]) ax2.plot(arange(11)*1e-5) ax2.yaxis.set_major_formatter(ScalarFormatterScientific()) ax2.text(1,6e-5,'y=1e-5*x') ax2.xaxis.set_visible(False) ax3 = axes([.225,.28,.75,.2]) ax3.plot(arange(11)*1e-10+1e-5) ax3.yaxis.set_major_formatter(ScalarFormatterScientific()) ax3.text(1,1e-5+6e-10,'y=1e-10*x+1e-5') ax3.xaxis.set_visible(False) ax4 = axes([.225,.05,.75,.2]) ax4.plot(arange(11)*1e-10+1e-5) ax4.yaxis.set_major_formatter(ScalarFormatterScientific(useOffset=False)) ax4.text(1,1e-5+6e-10,'y=1e-10*x+1e-5, no offset') show() |