Basemap & ax parameter : bug or feature ?

All (and Jeff W. in particular),

It's the time of the year where I have to draw maps in batch. I wrote a script to process some data recorded at various stations, interpolate the data on a grid, draw the corresponding contours on a basemap, add a colorbar, and end with adding some extra information on the map (scale, stations positions...).

Nothing too fancy, but I ran into a problem with the last few steps. As I do not give an explicit 'ax' parameter to any of the basemap related methods (.contourf, .plot, .drawmapscale...), I have to rely on the defaults: use self.ax if it is not None, gca() otherwise. However, drawing a colorbar in midprocess switches the focus to the colorbar, and the extra information I was talking about gets plotted on the colorbar.

Which brings me to the famous question: is it a bug or a feature ? Is there any rational in *not* setting the 'ax' attribute to gca() when sit hasn't been set yet and no 'ax' parameter has been specifically given as input of a method ?

Thanks a lot in advance for any explanation:
P.

[As a workaround, I modified my local sources by adding a ._check_ax method as below, and used :
ax = ax or self._check_ax(ax)
or
ax = kwargs.pop('ax', None) or self._check_ax()
depending on the context

     def _check_ax(self, ax=None):
         """
     Returns the axis on which to draw.
     By default, returns self.ax. If this latter is None, set it to gca().
         """

···

#
         if ax is None:
             if self.ax is None:
                 try:
                     ax = plt.gca()
                 except:
                     import matplotlib.pyplot as plt
                     ax = plt.gca()
                 self.ax = ax
             return self.ax
         return ax

Pierre GM wrote:

All (and Jeff W. in particular),

It's the time of the year where I have to draw maps in batch. I wrote a script to process some data recorded at various stations, interpolate the data on a grid, draw the corresponding contours on a basemap, add a colorbar, and end with adding some extra information on the map (scale, stations positions...).

Nothing too fancy, but I ran into a problem with the last few steps. As I do not give an explicit 'ax' parameter to any of the basemap related methods (.contourf, .plot, .drawmapscale...), I have to rely on the defaults: use self.ax if it is not None, gca() otherwise. However, drawing a colorbar in midprocess switches the focus to the colorbar, and the extra information I was talking about gets plotted on the colorbar.

Which brings me to the famous question: is it a bug or a feature ? Is there any rational in *not* setting the 'ax' attribute to gca() when sit hasn't been set yet and no 'ax' parameter has been specifically given as input of a method ?
  
Pierre: The reason I did it that way was so that the basemap instance could be created independent of any axes instances. For instance, you can create a basemap instance before an axes instance is created, or you read in a basemap instance from a pickle. If a axes instance is associated with a Basemap instance, you can't save it in a pickle. If I understand you correctly, you are suggesting that when the basemap instance is created, the "ax" attribute be set to plt.gca() if no axes instance is passed in through the kwarg, instead of just setting it to None. In that case, an axes instance will be created and assigned to the Basemap instance if one doesn't already exist. I guess I don't see any compelling reason for that, since you can always assign an axes instance to the Basemap instance later (via "map.ax = plt.gca()". I'd rather have this done explicitly by the user, than have it happen automatically, with potentially surprising results.

-Jeff

···

Thanks a lot in advance for any explanation:
P.

[As a workaround, I modified my local sources by adding a ._check_ax method as below, and used :
ax = ax or self._check_ax(ax)
or
ax = kwargs.pop('ax', None) or self._check_ax()
depending on the context

     def _check_ax(self, ax=None):
         """
     Returns the axis on which to draw.
     By default, returns self.ax. If this latter is None, set it to gca().
         """
         #
         if ax is None:
             if self.ax is None:
                 try:
                     ax = plt.gca()
                 except:
                     import matplotlib.pyplot as plt
                     ax = plt.gca()
                 self.ax = ax
             return self.ax
         return ax

------------------------------------------------------------------------------
Are you an open source citizen? Join us for the Open Source Bridge conference!
Portland, OR, June 17-19. Two days of sessions, one day of unconference: $250.
Need another reason to go? 24-hour hacker lounge. Register today!
http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options