On Fri, May 21, 2010 at 5:16 PM, Jeff Whitaker <jsw...@fastmail.fm> wrote:
> > On 5/21/10 3:57 PM, Benjamin Root wrote: > > I did some more digging and I think I have a hypothesis for what is > happening. > > There is only one main difference between a call to .drawstates() and > .readshapefiles() with respect to loading and plotting data. .drawstates() > loads *only* the line segments that coincide with the defined map > boundaries, while .readshapefiles() loads all of the data in the shapefile. > Therefore, the LineCollection that gets attached to the axis contains data > from outside the stated domain. > > In addition, the basemap versions of the plotting functions have the > benefit of finishing their calls with a call to .set_axes_limits(), which > keeps the axes in check. However, a non-basemap version would not call that > automatically, thereby having its axes automatically expanded to contain all > of the data in the LineCollection. > > I am not sure what exactly should be done about this. This is certainly > un-intuitive behavior, though. Maybe there could be a keyword option in > .readshapefile() to have only the data for the stated domain loaded? That > might solve the issue. > > Thanks, > Ben Root > > > Ben: That's why you should use the basemap methods where possible (they > handle these things for you). > Yeah, that wasn't possible in my case. In addition, not all pyplot plotting functions are available (nor do I expect Basemap to have all of them available). Therefore, it often makes more sense for me to use the pyplot functions and just give Basemap the axes. > You could also turn autoscaling off on your axes using > > ax.set_autoscaleon(False) > > and then they won't automatically expand when you plot data outside your > map region. Or, you could just call the set_axes_limits() methods before > you draw the plot. > > At the least, I think this advice should be thoroughly documented, especially in the docstring for readshapefile(). This behavior was quite perplexing to me and it took a while to figure out the cause. I am one of those people who will not leave well enough alone... Clipping the polygons to the map projection region is non-trivial, and I > don't think I want to add that to readshapefile. > > Personally, I think there should be a family of .draw*() functions that behave like .drawstates(). One of those functions can be .drawshapefile(). Then there would be a family of .read*() functions that could be called either by the user or by the .draw*() functions. The .read*() function could have an option to perform a clip of the incoming data. If you like to discuss this further, I would be more than happy to help out. Ben Root
------------------------------------------------------------------------------
_______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users