From: John H. <jdh...@ac...> - 2006-03-20 05:51:28
|
>>>>> "Eric" == Eric Firing <ef...@ha...> writes: Eric> All, Motivated in part by an old patch (1233294) submitted Eric> to sourceforge by Nikolai Hlubek, I took a look at how Eric> aspect ratio is handled in mpl, and concluded it wasn't Eric> quite right: Just a few quick comments since I haven't had a chance to look over this in any detail. Eric> 1) The aspect='preserve' kwarg in image caused the image to Eric> retain its aspect ratio only with some resize events, not Eric> with all. The implementation in the image.py code does not Eric> look right to me. Eric> Therefore I have reworked the aspect-handling code in Eric> axes.py, and I think it is working reasonably well. Indeed, Eric> I don't see any remaining need for an "aspect" kwarg in Eric> image.py, and I would like to take it out unless someone Eric> raises an objection. The aspect handling of images has been known to be broken from the early days, but in those days we didn't even have aspect='equal' functionality, and so adding preserved aspect ratio proved to daunting. Noone has revisited the issue (until now) since Mark Bakkar finally (mostly) got proper aspect handling in the axes. So your observations are on target, and the image aspect handling is an anachronism that everyone quickly learned to ignore. Eric> def set_aspect(self, aspect='auto', fixLimits=None, Eric> aspect_adjusts='position'): """ aspect: 'auto' - automatic; Eric> fill position rectangle with data 'normal' - same as 'auto'; Eric> deprecated 'equal' - same scaling from data to plot units Eric> for x and y A - a circle will be stretched such that the Eric> height is A times the width. aspect=1 is the same as Eric> aspect='equal'. Mark Bakkar wrote most of the aspect handling for the axes, and so he can response most intelligently to these changes. You should send him your original post since he may not be on this list. He's CCd above. Eric> One question: is there an easy way to automatically trigger Eric> a redraw in an interactive backend (e.g. ipython with Eric> gtkagg) at the end of the set_aspect() method, for example? Eric> The way it works now is that one can make a plot, call the Eric> set_aspect() method on the resulting axes object, and the Eric> result will appear as soon as the window is manipulated with Eric> the mouse; but this manipulation is needed to trigger a Eric> redraw. You should be able to do something like if rcParams['interactive']: self.figure.canvas.draw() where self is an Axes instance. Untested, but I think it is valid across backends. Thanks for the submission -- I look forward to testing it. JDH |