Hi, this scalebar is a really good idea!
However, I suggest that all parameters must be optional: - The position could be by default somewhere in the lower left corner (for example). It may be interesting to find a "best" position using the algo of legend. - Then length could be estimated from automatically from the map coordinates. On Tue, Mar 4, 2008 at 3:47 PM, Michael Hearne <[EMAIL PROTECTED]> wrote: > Jeff - I think the way GMT does it would be okay - they have a latitude of > true scale, which I usually choose as the center latitude of the map. > > I was thinking we should allow people to choose the "simple" or "fancy" > options. Do you think it will be okay to have the height of the bar and the > text offset be relative to the length of it? I suppose if the height > becomes a problem, people could use the yoffset keyword... > > --Mike > > > On Mar 4, 2008, at 6:05 AM, Jeff Whitaker wrote: > > Michael Hearne wrote: > Jeff - That would replicate the "simple" scale-bar from GMT. Below is my > not-complete attempt at replicating the "fancy" scale bar. It would need > some options for specifying different units (miles, nautical miles, etc.) > and perhaps some more attention to spacing of the text from the scale bar > and tick marks... > > --Mike > > Mike: Very nice! Do you want the scale to show the true distance on the > earth (in which case the labels will vary depending on where the label is > placed), or the distance in map projection coordinates (in which case the > labels are constant)? Or perhaps a lat/lon value could be given to specify > where the scale is true? > > -Jeff > > from numpy import * > from matplotlib.toolkits.basemap import Basemap, pyproj > from pylab import * > # add drawscale method to Basemap class. > class Basemap2(Basemap): > def drawscale(self,lon,lat,length,yoffset=None): > """draw a fancy map scale from lon-length/2,lat-yoffset to > lon-length/2,lat-yoffset, label it with actual distance in km""" > length = length*1000 #input length is km > > #we need 5 sets of x coordinates (in map units) > #center of scale > xc,yc = self(lon,lat) > #left edge of scale > lon1,lat1 = self(xc-length/2,yc,inverse=True) > x1,y1 = self(lon1,lat1) > #quarter scale > lon2,lat2 = self(xc-length/4,yc,inverse=True) > x2,y2 = self(lon2,lat2) > #three quarter scale > lon3,lat3 = self(xc+length/4,yc,inverse=True) > x3,y3 = self(lon3,lat3) > #right edge of scale > lon4,lat4 = self(xc+length/2,yc,inverse=True) > x4,y4 = self(lon4,lat4) > if yoffset is None: yoffset = 0.1*length > > #plot top line > ytop = yc+yoffset/2 > ybottom = yc-yoffset/2 > ytick = ybottom - yoffset/2 > ytext = ytick - yoffset/2 > m.plot([x1,x4],[ytop,ytop],color='k') > #plot bottom line > m.plot([x1,x4],[ybottom,ybottom],color='k') > #plot left edge > m.plot([x1,x1],[ybottom,ytop],color='k') > #plot right edge > m.plot([x4,x4],[ybottom,ytop],color='k') > > #make a filled black box from left edge to 1/4 way across > fill([x1,x2,x2,x1,x1],[ytop,ytop,ybottom,ybottom,ytop],'k') > #make a filled white box from 1/4 way across to 1/2 way across > fill([x2,xc,xc,x2,x2],[ytop,ytop,ybottom,ybottom,ytop],'w') > #make a filled white box from 1/2 way across to 3/4 way across > fill([xc,x3,x3,xc,xc],[ytop,ytop,ybottom,ybottom,ytop],'k') > #make a filled white box from 3/4 way across to end > fill([x3,x4,x4,x3,x3],[ytop,ytop,ybottom,ybottom,ytop],'w') > #plot 3 tick marks at left edge, center, and right edge > m.plot([x1,x1],[ytick,ybottom],color='k') > m.plot([xc,xc],[ytick,ybottom],color='k') > m.plot([x4,x4],[ytick,ybottom],color='k') > > #label 3 tick marks > text(x1,ytext,'%d' % (0),\ > horizontalalignment='center',\ > verticalalignment='top',\ > fontsize=9) > text(xc,ytext,'%d' % (round((length/2)/1000)),\ > horizontalalignment='center',\ > verticalalignment='top',\ > fontsize=9) > text(x4,ytext,'%d' % (round((length)/1000)),\ > horizontalalignment='center',\ > verticalalignment='top',\ > fontsize=9) > > #put units on top > text(xc,ytop+yoffset/2,'km',\ > horizontalalignment='center',\ > verticalalignment='bottom',\ > fontsize=9) > > # setup of basemap ('lcc' = lambert conformal conic). > # use major and minor sphere radii from WGS84 ellipsoid. > m = > Basemap2(llcrnrlon=-145.5,llcrnrlat=1.,urcrnrlon=-2.566,urcrnrlat=46.352,\ > rsphere=(6378137.00,6356752.3142),\ > resolution='l',area_thresh=1000.,projection='lcc',\ > lat_1=50.,lon_0=-107.) > # draw coastlines and political boundaries. > m.drawcoastlines() > m.fillcontinents() > # draw parallels and meridians. > # label on left, right and bottom of map. > m.drawparallels(arange(0.,80,20.),labels=[1,1,0,1]) > m.drawmeridians(arange(10.,360.,30.),labels=[1,1,0,1]) > # draw a line from x1,y to x2,y and label it with distance in km. > length = 3000 #kilometers > x1,y1 = 0.25*m.xmax, 0.25*m.ymax > lon1,lat1 = m(x1,y1,inverse=True) > m.drawscale(lon1,lat1,length) > title('a fancy map scale') > show() > > > > > ------------------------------------------------------ > Michael Hearne > [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > (303) 273-8620 > USGS National Earthquake Information Center > 1711 Illinois St. Golden CO 80401 > Senior Software Engineer > Synergetics, Inc. > ------------------------------------------------------ > > > > > > -- > Jeffrey S. Whitaker Phone : (303)497-6313 > NOAA/OAR/CDC R/PSD1 FAX : (303)497-6449 > 325 Broadway Boulder, CO, USA 80305-3328 > > > > > > ------------------------------------------------------ > Michael Hearne > [EMAIL PROTECTED] > (303) 273-8620 > USGS National Earthquake Information Center > 1711 Illinois St. Golden CO 80401 > Senior Software Engineer > Synergetics, Inc. > ------------------------------------------------------ > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Microsoft > Defy all challenges. Microsoft(R) Visual Studio 2008. > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ > _______________________________________________ > Matplotlib-users mailing list > Matplotlib-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/matplotlib-users > > -- Stephane Raynaud ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ Matplotlib-users mailing list Matplotlib-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-users