Thanks Jeff, that does what I want. It seems to be efficient, as long as
you don't try to plot 10.000+ values on a small map (results in a
colored rectangle anyway...). After thinning out my data
data = data.compress(maskX, axis=1)
data = data.compress(maskY, axis=0)
it seems to be only a little bit slower than contour / contourf.
Simon
Jeff Whitaker schrieb:
> Simon Kammerer wrote:
>> Hi list,
>>
>> what's the best (meaning most efficient/fastest) way to plot grid
>> point values on a map created with basemap?
>>
>> I'd like to plot the raw values of my dataarray to the correspondig
>> gridpoints, instead of having it transformed to something like contour
>> or contourf. The ne plus ultra would be the ability to assing a
>> colormap, to control the font color of the plotted values...
>>
>> Regards
>> Simon
>>
>>
>
> Simon: I don't know about efficiency, but this does what you want:
>
> from pylab import show, title, arange, figure, title, arccos, pi, cm,
> text, sqrt
> import random
> from matplotlib.colors import rgb2hex
> from matplotlib.toolkits.basemap import Basemap
> from matplotlib.numerix.random_array import uniform
>
> # Plot a bunch of randomly distributed points on the earth.
>
> # set up stereographic map centered on N. Pole.
> m = Basemap(lon_0=105,boundinglat=30.,resolution='l',
> area_thresh=10000.,projection='npstere')
> # number of points to plot.
> npts = 300
> # generate random points on a sphere,
> # so that every small area on the sphere is expected
> # to have the same number of points.
> # http://mathworld.wolfram.com/SpherePointPicking.html
> try: # this works for numpy
> u = uniform(0.,1.,size=npts)
> v = uniform(0.,1.,size=npts)
> z = uniform(0,100,size=npts)
> except: # this works for Numeric/numarray
> u = uniform(0.,1.,shape=npts)
> v = uniform(0.,1.,shape=npts)
> z = uniform(0,100,shape=npts)
> lons = 360.*u
> lats = (180./pi)*arccos(2*v1)  90.
> # transform lons and lats to map coordinates.
> x,y = m(lons,lats)
> # create a list of strings containing z values
> zn = [ '%2i' % zz for zz in z ]
> # plot numbers on map, colored by value.
> vmin = 0; vmax = 100
> cmap = cm.jet # use 'jet' colormap
> for name,zval,xpt,ypt in zip(zn,z,x,y):
> # only plot values inside map region.
> if xpt > m.xmin and xpt < m.xmax and ypt > m.ymin and ypt < m.ymax:
> rgbcolor = cmap(1.(zvalvmin)/(vmaxvmin))[:3]
> hexcolor = rgb2hex(rgbcolor)
> text(xpt,ypt,name,fontsize=9,weight='bold',color=hexcolor)
> # draw coasts and fill continents.
> m.drawcoastlines(linewidth=0.5)
> m.fillcontinents()
> # draw parallels and meridians.
> delat = 20.
> circles = arange(0.,90.,delat).tolist()+\
> arange(delat,90,delat).tolist()
> m.drawparallels(circles)
> delon = 45.
> meridians = arange(0,360,delon)
> m.drawmeridians(meridians,labels=[1,1,1,1])
> title('Random Data Value at Random Points',y=1.075)
> show()
>
>
> HTH,
>
> Jeff
>
>
> 
>
