On 3/17/07, Bill Baxter <[EMAIL PROTECTED]> wrote: A pox on matplotlib's default reply-to-sender! Resending my reply that went to Fernando alone below.
> On 3/17/07, Fernando Perez <[EMAIL PROTECTED]> wrote: > > On 3/16/07, Bill Baxter <[EMAIL PROTECTED]> wrote: > > > Why does pylab.matshow() create a new figure by default when no other > > > standard pylab function I know of does that? It seems very > > > inconsistent for no particular gain, since as always > > > figure();matshow(m) will achieve that result if that is what is > > > desired. > > > > No: matshow has to create a figure with a non-standard size so that > > the final figure has the same aspect ratio as the array being > > displayed. If you call figure() first, the figure has already been > > created. > > > > The code: > > > > # Extract actual aspect ratio of array and make appropriately sized > > figure > > w,h = figaspect(arr) > > fig = figure(fignum,figsize=(w,h)) > I guess that makes sense. Personally I'd rather have consistency. I'm not sure why matshow() in particular needs to have the window shape match the image shape. Why not just do axis('scaled') within the confines of the window you have? Tried it out, it seems to work pretty well, and seems more consistent with the way other things work in pylab. def mymatshow(*args,**kw): """Display an array as a matrix in a new figure window. The origin is set at the upper left hand corner and rows (first dimension of the array) are displayed horizontally. The aspect ratio of the figure window is that of the array, as long as it is possible to fit it within your screen with no stretching. If the window dimensions can't accomodate this (extremely tall/wide arrays), some stretching will inevitably occur. Tick labels for the xaxis are placed on top by default. matshow() calls imshow() with args and **kwargs, but by default it sets interpolation='nearest' (unless you override it). All other arguments and keywords are passed to imshow(), so see its docstring for further details. Special keyword arguments which are NOT passed to imshow(): - fignum(None): by default, matshow() creates a new figure window with automatic numbering. If fignum is given as an integer, the created figure will use this figure number. Because of how matshow() tries to set the figure aspect ratio to be the one of the array, if you provide the number of an already existing figure, strange things may happen. - returnall(False): by default, the return value is a figure instance. With 'returnall=True', a (figure, axes, image) tuple is returned. Example usage: def samplemat(dims): aa = zeros(dims) for i in range(min(dims)): aa[i,i] = i return aa dimlist = [(12,12),(128,64),(64,512),(2048,256)] for d in dimlist: fig, ax, im = matshow(samplemat(d)) show() """ # Preprocess args for our purposes arr = asarray(args[0]) # Extract unique keywords we can't pass to imshow kw = kw.copy() fignum = popd(kw,'fignum',None) retall = popd(kw,'returnall',False) # Extract actual aspect ratio of array and make appropriately sized figure w,h = figaspect(arr) #fig = figure(fignum,figsize=(w,h)) fig = gcf() cla() ax = fig.add_axes([0.15, 0.09, 0.775, 0.775]) axis('scaled') ax.xaxis.tick_top() ax.title.set_y(1.05) # raise it up a bit for tick top kw['aspect'] = 'auto' # imshow call: use 'lower' origin (we'll flip axes later) kw['origin'] = 'lower' # Unless overridden, don't interpolate kw.setdefault('interpolation','nearest') # All other keywords go through to imshow. im = ax.imshow(*args,**kw) gci._current = im # set the x and y lim to equal the matrix dims nr,nc = arr.shape[:2] ax.set_xlim((0,nc)) ax.set_ylim((nr,0)) draw_if_interactive() if retall: return fig, ax, im else: return fig --bb ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users