On Sunday, June 19, 2011, Lukmanul Hakim <plgse...@yahoo.com> wrote:
> Hello,
>
> I would like to ask for some hints
> and help. I am currently trying to plot a "pseudo contour" over a Basemap. 
> This contour is confined by borders obtained from a shapefile. I can generate 
> the contour, I can retrieve the shapefile and put them on a basemap. What I 
> have not been able to do is to limit the contour plot such that it only fills 
> the area defined by a shapefile (in my case it is bordered by Province 
> Lampung). You can use different shapefile for example, as the point of my 
> question is how to limit contour fill by a shapefile.
>
> Shapefile can be downloaded from http://www.gadm.org/data/shp/IDN_adm.zip
>
> The generated figure can be found here:
> https://lh3.googleusercontent.com/-hMlwe6MAjdc/Tf6HlxYxn1I/AAAAAAAAAEY/exdzSv30ZL4/s640/to_matplotlib_userlists.png
>
> Thanks for the help!
> --
> Lukmanul Hakim
>
> Here's the code:
> ----------------
> from pylab import cm
> import matplotlib.pyplot as plt
> import numpy as np
> from mpl_toolkits.basemap import Basemap
>
> #Define area about Province Lampung
> ulat, llat, ulon, llon = -2.5, -6.5, 107, 103
> m = Basemap(projection='merc', lon_0=0.0, llcrnrlon=llon,
>                      llcrnrlat=llat, urcrnrlon=ulon, urcrnrlat=ulat,
>                      resolution='i')
>
>
> #Read shapefile of Province Lampung
> s = m.readshapefile('E:/Works/UNILA/Research/IDN_adm/LampungMap/LampungMap', 
> 'lampung')
>
> #Define area for contour plot
> llon1,ulon1 = 103,106
> llat1,ulat1 = -6,-3.5
>
> #Generate random data
> nx,ny=5,5
> data2 = np.random.sample((ny,nx))
> x = np.linspace(llon1, ulon1, nx)
> y = np.linspace(llat1, ulat1, ny)
> X,Y = np.meshgrid(x,y)
> px,py = m(X,Y)
> m.contourf(px, py, data2, cmap=cm.jet)
> m.drawcoastlines()#(linewidth=0.5)
> m.drawparallels(np.arange(-6.5,-2.5,1.),labels=[1,0,0,0],color='black',dashes=[1,0],labelstyle='+/-',linewidth=0.2)
>  # draw parallels
> m.drawmeridians(np.arange(102.,108.,1.),labels=[0,0,0,1],color='black',dashes=[1,0],labelstyle='+/-',linewidth=0.2)
>  # draw meridians
>
> plt.show()

Not exactly sure how to do this, but if you can get a true/false mask
of the region in the same shape as the input data, then you can have a
masked array that goes into contourf.  Any area where the mask was
true will be blanked.

The hard part, though is getting the mask.

I hope that helps!
Ben Root

------------------------------------------------------------------------------
EditLive Enterprise is the world's most technically advanced content
authoring tool. Experience the power of Track Changes, Inline Image
Editing and ensure content is compliant with Accessibility Checking.
http://p.sf.net/sfu/ephox-dev2dev
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to