On Thu, Jun 10, 2010 at 11:56 AM, Jeff Whitaker <jsw...@fastmail.fm> wrote:
> On 6/10/10 10:41 AM, Benjamin Root wrote: > > > > On Thu, Jun 10, 2010 at 11:05 AM, Jeff Whitaker <jsw...@fastmail.fm>wrote: > >> On 6/9/10 1:58 PM, Benjamin Root wrote: >> >> Has anybody given any further thought to the implication of having Basemap >> set adjustable as "box-forced" instead of "box"? So far, it has been >> working just fine for me, but I have no clue if there are any unintended >> side-effects. >> >> Ben Root >> >> >> Ben: To summarize the discussion so far, it seems that "box-forced" >> should not be used, and either Basemap should continue to use >> adjustable="box" (for the reasons Eric gave in his post yesterday) or >> adjustable should not be set at all by Basemap and that job should be left >> to the user (since adjustable='box' is the default anyway, as Jae-Joon >> pointed out today). Perhaps it would help if you could provide a usage >> example for AxesGrid axes sharing with Basemap, so we can see what the >> consequences of changing the current behavior are. >> >> -Jeff >> >> > Maybe it isn't a use-case per se, but I have found that it is much easier > to use axes_grid1 instead of subplots to produce multiple radar plots that > all use the same colorbar. For example, I have 3 radar plots to show, and I > want a single colorbar on the right-hand side. To a newbie, one would add > three subplots with a .colorbar() command for the last one. Unfortunately, > the newbie will discover that the third plot will be smaller than the other > two because that last axes has to be split between two objects. To someone > a little more advanced, you would create 4 subplots, but fool around with > the size of the last axes (and also have to discover to use ColorbarBase > instead of the regular colorbar call). > > But, with axes_grid, this is quite trivial and the results look very nice. > > Attached is a png image of a time series I recent submitted in a > publication. > > Ben Root > > P.S. - I have found a 'bug' of sorts with using 'box-forced' for Basemap > and AxesGrid. For the displayed plot, if one were to zoom in on one of the > plots, the other plots will zoom in as well (which I think is neat), but > they won't update their bbox to completely match the zoomed-in axes. I > guess this would be an argument against using 'box-forced'? > > > Ben: Could you send the code that produced this plot? > > I'm thinking that just removing the adjustable='box' from Basemap > altogether is the best solution. Can you try editing > lib/mpl_toolkits/basemap/__init__.py and removing the two occurences of > adjustable='box' in set_axes_limits works for you? > Jeff, here is a very simple script that gets the idea across (the code and the data for producing those plots are rather extensive...). Taking out adjustable='box' had the same effect for me as setting adjustable='box-forced'. You can see the zooming issue I was talking about before as well when you interact with the displayed figure. Ben Root > > Index: lib/mpl_toolkits/basemap/__init__.py > =================================================================== > --- lib/mpl_toolkits/basemap/__init__.py (revision 8406) > +++ lib/mpl_toolkits/basemap/__init__.py (working copy) > @@ -2628,9 +2628,9 @@ > # plot is re-centered in bounding rectangle. > # (anchor instance var determines where plot is placed) > if self.fix_aspect: > - ax.set_aspect('equal',adjustable='box',anchor=self.anchor) > + ax.set_aspect('equal',anchor=self.anchor) > else: > - ax.set_aspect('auto',adjustable='box',anchor=self.anchor) > + ax.set_aspect('auto',anchor=self.anchor) > # make sure axis ticks are turned off. > if self.noticks: > ax.set_xticks([]) > > We definitely don't want to use 'box-forced', I think that will cause many > problems. > > -Jeff > > > > >> >> >> On Tue, Jun 1, 2010 at 6:00 PM, Benjamin Root <ben.r...@ou.edu> wrote: >> >>> Right, that is sort of what I am asking. My thinking is that Basemap >>> could use 'box-forced' instead of 'box' for the adjustable parameter in >>> order to make it and AxesGrid compatible. Usually, if one wants to use >>> AxesGrid, they all should have the same domain and aspect ratio. I just >>> have no clue what sort of repricussions that has for other use cases. >>> >>> So far, this has worked just fine for me, but I hardly represent the >>> normal use cases of Basemap and AxesGrid. >>> >>> Ben Root >>> >>> >>> On Tue, Jun 1, 2010 at 5:20 PM, Jae-Joon Lee <lee.j.j...@gmail.com>wrote: >>> >>>> If Basemap explicitly sets aspect=1 and adjustable="box" at the same >>>> time, you cannot use this with any axes that shares its axis with >>>> others (including the axes created by the AxesGrid). >>>> >>>> You need to somehow avoid the set_aspect call with adjustable"box" >>>> (you can set box-forced in stead). >>>> >>>> -JJ >>>> >>>> >>>> On Tue, Jun 1, 2010 at 2:45 PM, Benjamin Root <ben.r...@ou.edu> wrote: >>>> > >>>> > On a related note, I have noticed an incompatibility between AxesGrid >>>> and >>>> > Basemap. It appears that Basemap will explicitly set adjustable='box' >>>> when >>>> > it calls ax.set_aspect(), but AxesGrid will error out, saying that it >>>> has to >>>> > be 'datalim'. What are the implications of using 'box-forced' instead >>>> of >>>> > 'box' in Basemap? >>>> > >>>> > Ben Root >>>> > >>>> > On Thu, May 27, 2010 at 1:59 PM, Jae-Joon Lee <lee.j.j...@gmail.com> >>>> wrote: >>>> >> >>>> >> ax1 = subplot(121) >>>> >> ax2 = subplot(122, sharex=ax1, sharey=ax1) >>>> >> >>>> >> ax1.set_adjustable("box-forced") >>>> >> ax2.set_adjustable("box-forced") >>>> >> >>>> >> arr1 = np.arange(100).reshape((10, 10)) >>>> >> ax1.imshow(arr1) >>>> >> >>>> >> arr2 = np.arange(100, 0, -1).reshape((10, 10)) >>>> >> ax2.imshow(arr2) >>>> >> >>>> >> Note the use of set_adjustable("box-forced"). >>>> >> sharex and sharey does not get along with axes of aspect=1 & >>>> >> adjustable="box". >>>> >> >>>> >> -JJ >>>> >> >>>> >> >>>> >> >>>> >> On Thu, May 27, 2010 at 2:10 PM, <phob...@geosyntec.com> wrote: >>>> >> > Do the “sharex” and “sharey” kwargs help? >>>> >> > >>>> >> > >>>> >> > >>>> http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.axes >>>> >> > >>>> >> > >>>> >> > >>>> http://matplotlib.sourceforge.net/examples/pylab_examples/shared_axis_demo.html >>>> >> > >>>> >> > -paul >>>> >> > >>>> >> > >>>> >> > >>>> >> > From: Adam Fraser [mailto:adam.n.fra...@gmail.com] >>>> >> > Sent: Thursday, May 27, 2010 10:44 AM >>>> >> > To: matplotlib-users >>>> >> > Subject: [Matplotlib-users] Is there a way to link axes of imshow >>>> plots? >>>> >> > >>>> >> > >>>> >> > >>>> >> > Suppose I have a figure canvas with 3 plots... 2 are images of the >>>> same >>>> >> > dimensions plotted with imshow, and the other is a scatterplot. I'd >>>> like >>>> >> > to >>>> >> > be able to link the x and y axes of the imshow plots so that when I >>>> zoom >>>> >> > in >>>> >> > one, the other zooms to the same coordinates, and when I pan in >>>> one, the >>>> >> > other pans as well. >>>> >> > >>>> >> > >>>> >> > >>>> >> > I started hacking my way around this by >>>> >> > subclassing NavigationToolbar2WxAgg >>>> >> > (shown below)... but there are several problems here. >>>> >> > >>>> >> > 1) This will link the axes of all plots in a canvas since all I've >>>> done >>>> >> > is >>>> >> > get rid of the checks for a.in_axes() >>>> >> > >>>> >> > 2) This worked well for panning, but zooming caused all subplots to >>>> zoom >>>> >> > from the same global point, rather than from the same point in each >>>> of >>>> >> > their >>>> >> > respective axes. >>>> >> > >>>> >> > >>>> >> > >>>> >> > Can anyone suggest a workaround? >>>> >> > >>>> >> > >>>> >> > >>>> >> > Much thanks! >>>> >> > >>>> >> > -Adam >>>> >> > >>>> >> > >>>> >> > >>>> >> > from matplotlib.backends.backend_wxagg import >>>> NavigationToolbar2WxAgg as >>>> >> > NavigationToolbar >>>> >> > >>>> >> > class MyNavToolbar(NavigationToolbar): >>>> >> > >>>> >> > def __init__(self, canvas, cpfig): >>>> >> > >>>> >> > NavigationToolbar.__init__(self, canvas) >>>> >> > >>>> >> > >>>> >> > >>>> >> > # override >>>> >> > >>>> >> > def press_pan(self, event): >>>> >> > >>>> >> > 'the press mouse button in pan/zoom mode callback' >>>> >> > >>>> >> > >>>> >> > >>>> >> > if event.button == 1: >>>> >> > >>>> >> > self._button_pressed=1 >>>> >> > >>>> >> > elif event.button == 3: >>>> >> > >>>> >> > self._button_pressed=3 >>>> >> > >>>> >> > else: >>>> >> > >>>> >> > self._button_pressed=None >>>> >> > >>>> >> > return >>>> >> > >>>> >> > >>>> >> > >>>> >> > x, y = event.x, event.y >>>> >> > >>>> >> > >>>> >> > >>>> >> > # push the current view to define home if stack is empty >>>> >> > >>>> >> > if self._views.empty(): self.push_current() >>>> >> > >>>> >> > >>>> >> > >>>> >> > self._xypress=[] >>>> >> > >>>> >> > for i, a in enumerate(self.canvas.figure.get_axes()): >>>> >> > >>>> >> > # only difference from overridden method is that this >>>> one >>>> >> > doesn't >>>> >> > >>>> >> > # check a.in_axes(event) >>>> >> > >>>> >> > if x is not None and y is not None and >>>> a.get_navigate(): >>>> >> > >>>> >> > a.start_pan(x, y, event.button) >>>> >> > >>>> >> > self._xypress.append((a, i)) >>>> >> > >>>> >> > self.canvas.mpl_disconnect(self._idDrag) >>>> >> > >>>> >> > >>>> >> > self._idDrag=self.canvas.mpl_connect('motion_notify_event', >>>> >> > self.drag_pan) >>>> >> > >>>> >> > >>>> >> > >>>> >> > def press_zoom(self, event): >>>> >> > >>>> >> > 'the press mouse button in zoom to rect mode callback' >>>> >> > >>>> >> > if event.button == 1: >>>> >> > >>>> >> > self._button_pressed=1 >>>> >> > >>>> >> > elif event.button == 3: >>>> >> > >>>> >> > self._button_pressed=3 >>>> >> > >>>> >> > else: >>>> >> > >>>> >> > self._button_pressed=None >>>> >> > >>>> >> > return >>>> >> > >>>> >> > >>>> >> > >>>> >> > x, y = event.x, event.y >>>> >> > >>>> >> > >>>> >> > >>>> >> > # push the current view to define home if stack is empty >>>> >> > >>>> >> > if self._views.empty(): self.push_current() >>>> >> > >>>> >> > >>>> >> > >>>> >> > self._xypress=[] >>>> >> > >>>> >> > for i, a in enumerate(self.canvas.figure.get_axes()): >>>> >> > >>>> >> > # only difference from overridden method is that this >>>> one >>>> >> > doesn't >>>> >> > >>>> >> > # check a.in_axes(event) >>>> >> > >>>> >> > if x is not None and y is not None and a.get_navigate() >>>> and >>>> >> > a.can_zoom(): >>>> >> > >>>> >> > self._xypress.append(( x, y, a, i, >>>> a.viewLim.frozen(), >>>> >> > a.transData.frozen())) >>>> >> > >>>> >> > >>>> >> > >>>> >> > self.press(event) >>>> >> > >>>> >> > >>>> >> > >>>> >> > >>>> >> > >>>> >> > >>>> >> > >>>> >> > >>>> >> > >>>> ------------------------------------------------------------------------------ >>>> >> > >>>> >> > >>>> >> > _______________________________________________ >>>> >> > Matplotlib-users mailing list >>>> >> > matplotlib-us...@lists.sourceforge.net >>>> >> > https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>>> >> > >>>> >> > >>>> >> >>>> >> >>>> >> >>>> ------------------------------------------------------------------------------ >>>> >> >>>> >> _______________________________________________ >>>> >> Matplotlib-users mailing list >>>> >> matplotlib-us...@lists.sourceforge.net >>>> >> https://lists.sourceforge.net/lists/listinfo/matplotlib-users >>>> > >>>> > >>>> > >>>> ------------------------------------------------------------------------------ >>>> > >>>> > >>>> > _______________________________________________ >>>> > Matplotlib-devel mailing list >>>> > Matplotlib-devel@lists.sourceforge.net >>>> > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel >>>> > >>>> > >>>> >>>> >>>> ------------------------------------------------------------------------------ >>>> >>>> _______________________________________________ >>>> Matplotlib-devel mailing list >>>> Matplotlib-devel@lists.sourceforge.net >>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel >>>> >>> >>> >> >> >> -- >> Jeffrey S. Whitaker Phone : (303)497-6313 >> Meteorologist FAX : (303)497-6449 >> NOAA/OAR/PSD R/PSD1 Email : jeffrey.s.whita...@noaa.gov >> 325 Broadway Office : Skaggs Research Cntr 1D-113 >> Boulder, CO, USA 80303-3328 Web : http://tinyurl.com/5telg >> >> > > > -- > Jeffrey S. Whitaker Phone : (303)497-6313 > Meteorologist FAX : (303)497-6449 > NOAA/OAR/PSD R/PSD1 Email : jeffrey.s.whita...@noaa.gov > 325 Broadway Office : Skaggs Research Cntr 1D-113 > Boulder, CO, USA 80303-3328 Web : http://tinyurl.com/5telg > >
testaxesgrid.py
Description: Binary data
------------------------------------------------------------------------------ ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit. See the prize list and enter to win: http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________ Matplotlib-devel mailing list Matplotlib-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-devel