On 22/03/07, Eric Firing <[EMAIL PROTECTED]> wrote: > Richard Brown wrote: > > Hi there, > > > > I'm pretty new to python; I'm in the process of switching from Matlab. > > I do quite a bit of image processing in my research, and while > > pylab/matplotlib seems to be a great plotting library, some of the > > quirks seem just a little bit frustrating - I'm hoping for some > > enlightenment :) > > > > When I use imshow or matshow to display an array, the points with > > index (m, n) are displayed with the pixels centred at (0.5 + m, 0.5 + > > n). Is there a setting somewhere to make it so that the centres of the > > pixels are at the index values rather than their bottom left corners? > > Or must I be always adding 0.5 to things to make them appear in the > > right places? > > Coincidentally, a few days ago I made this change for matshow; I had > made it in spy some time ago. I have so far left imshow alone; isn't > its present behavior consistent with Matlab? That is not necessarily a > good reason for leaving it the way it is, but it is reason for some > caution. I suspect quite a few people may prefer it the way it is; > let's see who responds, and what opinions are voiced.
Thanks for your timely response. Let me give you a few examples to clarify the things which I think might be relevant issues to address. (numpy and pylab imported) PRELIMINARIES # Create a 6x6 logical array with a 2x2 square near the to left xx = zeros((6, 6), dtype='Bool') xx[1:3, 1:3] = True EXAMPLE 1 - imshow Trying to plot a point which should appear on the square: >>> imshow(xx, interpolation='nearest') >>> plot([2],[2], 'y.', markersize=20) The image looks correct, with the square in the top left, but the y axis is labelled backwards. Therefore when I try to plot a point in the middle of it, it misses altogether EXAMPLE 2 - matshow (not your new version) >>> matshow(xx) So far so good - the y axis is the right way around >>> plot([2],[2], 'y.', markersize=20) Oops - the y axis flipped, there is a block of white at the top, and the image is now upside-down. The point has showed up in the right place w.r.t the image though. EXAMPLE 3 - off by 0.5 problem - relevant to imshow too >>> matshow(xx) Let's say I want to compute the centroid of the square blob. IMO a natural way to do this is: >>> cen = mean(where(xx), 1) >>> plot([cen[0]], [cen[1]], 'y.') This is off by 0.5 in both directions. This kind of thing is my argument for why the coordinate system should be aligned with the array indices. Matlab behaviour: In Matlab, the pixels are centred on integer coordinates corresponding to their array index. Matlab indexing is ones based, so a 2x2 image will have axes limits of 0.5-2.5 in each direction, with the pixel centres at (1,1), (1,2) etc. imshow in Matlab plots the array with the (1,1) coordinate in the top left, and the y axis increasing from the top down (like what matshow does here) cheers, Richard ------------------------------------------------------------------------- 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