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
>
>

Attachment: 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

Reply via email to