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
testaxesgrid.py (1.3 KB)
···
On Thu, Jun 10, 2010 at 11:56 AM, Jeff Whitaker <jswhit@…272…196…> wrote:
On 6/10/10 10:41 AM, Benjamin Root wrote:
On Thu, Jun 10, 2010 at 11:05 AM, Jeff > > Whitaker <jswhit@…196…> > > wrote:
On 6/9/10 1:58 PM, Benjamin Root wrote:
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.root@…553…> > > > > 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.joon@…149…> > > > > > wrote:
If
Basemap
explicitly sets aspect=1 and adjustable=“box” at the sametime, 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.root@…553…> > > > > > > wrote:
On a related note, I have noticed an incompatibility between
AxesGrid andBasemap. It appears that Basemap will explicitly set
adjustable=‘box’ whenit calls ax.set_aspect(), but AxesGrid will error out, saying that
it has tobe ‘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.joon@…149…> 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, <PHobson@…855…> > > > > > > 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.fraser@…149…]
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 samedimensions plotted with imshow, and the other is a
scatterplot. I’d liketo
be able to link the x and y axes of the imshow plots so
that when I zoomin
one, the other zooms to the same coordinates, and when I
pan in one, theother pans as well.
I started hacking my way around this by
subclassing NavigationToolbar2WxAgg
(shown below)… but there are several problems here.
- This will link the axes of all plots in a canvas since
all I’ve doneis
get rid of the checks for a.in_axes()
- This worked well for panning, but zooming caused all
subplots to zoomfrom the same global point, rather than from the same
point in each oftheir
respective axes.
Can anyone suggest a workaround?
Much thanks!
-Adam
from matplotlib.backends.backend_wxagg import
NavigationToolbar2WxAgg asNavigationToolbar
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
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Matplotlib-users mailing list
https://lists.sourceforge.net/lists/listinfo/matplotlib-users
Matplotlib-devel mailing list
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](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.Whitaker@...236... 325 Broadway Office : Skaggs Research Cntr 1D-113 Boulder, CO, USA 80303-3328 Web : [http://tinyurl.com/5telg](http://tinyurl.com/5telg)
-- Jeffrey S. Whitaker Phone : (303)497-6313 Meteorologist FAX : (303)497-6449 NOAA/OAR/PSD R/PSD1 Email : Jeffrey.S.Whitaker@...236... 325 Broadway Office : Skaggs Research Cntr 1D-113 Boulder, CO, USA 80303-3328 Web : [http://tinyurl.com/5telg](http://tinyurl.com/5telg)