Revision: 4464
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4464&view=rev
Author: jswhit
Date: 2007-11-27 08:21:11 -0800 (Tue, 27 Nov 2007)
Log Message:
-----------
fmt kwarg to drawparallels and drawmeridians can now be a
string formatting function.
Modified Paths:
--------------
trunk/toolkits/basemap/Changelog
trunk/toolkits/basemap/examples/customticks.py
trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py
Modified: trunk/toolkits/basemap/Changelog
===================================================================
--- trunk/toolkits/basemap/Changelog 2007-11-27 13:12:10 UTC (rev 4463)
+++ trunk/toolkits/basemap/Changelog 2007-11-27 16:21:11 UTC (rev 4464)
@@ -1,4 +1,7 @@
version 0.9.8 (not yet released)
+ * 'fmt' kwarg to drawparallels and drawmeridians can
+ now be a custom string formatting function (example
+ customticks.py demonstrates usage).
* remove 'linestyle' kwarg from drawparallels and
drawmeridians (it never did anything anyway since
it was overridden by the 'dashes' kwarg).
Modified: trunk/toolkits/basemap/examples/customticks.py
===================================================================
--- trunk/toolkits/basemap/examples/customticks.py 2007-11-27 13:12:10 UTC
(rev 4463)
+++ trunk/toolkits/basemap/examples/customticks.py 2007-11-27 16:21:11 UTC
(rev 4464)
@@ -5,19 +5,32 @@
# example showing how to create custom tick labels for a cylindrical
# projection.
-def deg2str(deg, dir='E', fmt="%3.1f"):
+def lat2str(deg):
+ fmt = "%d"
min = 60 * (deg - numpy.floor(deg))
deg = numpy.floor(deg)
+ dir = 'N'
if deg < 0:
if min != 0.0:
deg += 1.0
min -= 60.0
- if dir=='E':
- dir='W'
- if dir=='N':
- dir='S'
- return (u"%d\N{DEGREE SIGN}" + fmt + "' %s") % (numpy.abs(deg),
numpy.abs(min), dir)
+ dir='S'
+ return (u"%d\N{DEGREE SIGN} %g' %s") % (numpy.abs(deg), numpy.abs(min),
dir)
+def lon2str(deg):
+ min = 60 * (deg - numpy.floor(deg))
+ deg = numpy.floor(deg)
+ dir = 'E'
+ if deg < 0:
+ if min != 0.0:
+ deg += 1.0
+ min -= 60.0
+ dir='W'
+ return (u"%d\N{DEGREE SIGN} %g' %s") % (numpy.abs(deg), numpy.abs(min),
dir)
+
+# (1) use matplotlib custom tick formatter
+# instead of Basemap labelling methods.
+
# create figure.
fig=pylab.figure()
# create Basemap instance (regular lat/lon projection).
@@ -35,14 +48,34 @@
ax = pylab.gca()
# add custom ticks.
# This only works for projection='cyl'.
-def xformat(x, pos=None): return deg2str(x, 'E', fmt="%2.0f")
+def xformat(x, pos=None): return lon2str(x)
xformatter = FuncFormatter(xformat)
ax.xaxis.set_major_formatter(xformatter)
-def yformat(y, pos=None): return deg2str(y, 'N', fmt="%2.0f")
+def yformat(y, pos=None): return lat2str(y)
yformatter = FuncFormatter(yformat)
ax.yaxis.set_major_formatter(yformatter)
-ax.fmt_xdata = lambda x: deg2str(x, 'E', fmt="%5.3f")
-ax.fmt_ydata = lambda y: deg2str(y, 'N', fmt="%5.3f")
+ax.fmt_xdata = lambda x: lon2str(x)
+ax.fmt_ydata = lambda y: lat2str(y)
ax.grid()
ax.set_title('Hawaii')
+
+# (2) use Basemap labelling methods, but pass a
+# custom formatting function with the 'fmt' keyword.
+
+# create figure.
+fig = pylab.figure()
+# create Basemap instance.
+m = Basemap(llcrnrlon=-156.5,llcrnrlat=18.75,urcrnrlon=-154.5,urcrnrlat=20.5,
+ resolution='h',projection='cyl')
+# draw coastlines, fill land and lake areas.
+m.drawcoastlines()
+m.fillcontinents(color='coral',lake_color='aqua')
+# background color will be used for oceans.
+m.drawmapboundary(fill_color='aqua')
+# label meridians and parallels, passing string formatting function
+# with 'fmt' keyword.
+m.drawparallels(numpy.linspace(18,21,7),labels=[1,0,0,0],fmt=lat2str)
+m.drawmeridians(numpy.linspace(-157,-154,7),labels=[0,0,0,1],fmt=lon2str)
+pylab.title('Hawaii')
+
pylab.show()
Modified: trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py
===================================================================
--- trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py
2007-11-27 13:12:10 UTC (rev 4463)
+++ trunk/toolkits/basemap/lib/matplotlib/toolkits/basemap/basemap.py
2007-11-27 16:21:11 UTC (rev 4464)
@@ -1375,7 +1375,9 @@
but not the right and top.
labelstyle - if set to "+/-", north and south latitudes are labelled
with "+" and "-", otherwise they are labelled with "N" and "S".
- fmt is a format string to format the parallel labels (default '%g').
+ fmt can be is a format string to format the parallel labels
+ (default '%g') or a function that takes a latitude value
+ in degrees as it's only argument and returns a formatted string.
xoffset - label offset from edge of map in x-direction
(default is 0.01 times width of map in map projection coordinates).
yoffset - label offset from edge of map in y-direction
@@ -1517,36 +1519,40 @@
nl = _searchlist(lats,lat)
nr = _searchlist(lats[::-1],lat)
if nr != -1: nr = len(lons)-nr-1
- if lat<0:
- if rcParams['text.usetex']:
- if labelstyle=='+/-':
- latlabstr = r'${\/-%s\/^{\circ}}$'%fmt
+ latlab = fmt(lat)
+ try: # fmt is a function that returns a formatted string
+ latlab = fmt(lat)
+ except: # fmt is a format string.
+ if lat<0:
+ if rcParams['text.usetex']:
+ if labelstyle=='+/-':
+ latlabstr = r'${\/-%s\/^{\circ}}$'%fmt
+ else:
+ latlabstr = r'${%s\/^{\circ}\/S}$'%fmt
else:
- latlabstr = r'${%s\/^{\circ}\/S}$'%fmt
- else:
- if labelstyle=='+/-':
- latlabstr = u'-%s\N{DEGREE SIGN}'%fmt
+ if labelstyle=='+/-':
+ latlabstr = u'-%s\N{DEGREE SIGN}'%fmt
+ else:
+ latlabstr = u'%s\N{DEGREE SIGN}S'%fmt
+ latlab = latlabstr%npy.fabs(lat)
+ elif lat>0:
+ if rcParams['text.usetex']:
+ if labelstyle=='+/-':
+ latlabstr = r'${\/+%s\/^{\circ}}$'%fmt
+ else:
+ latlabstr = r'${%s\/^{\circ}\/N}$'%fmt
else:
- latlabstr = u'%s\N{DEGREE SIGN}S'%fmt
- latlab = latlabstr%npy.fabs(lat)
- elif lat>0:
- if rcParams['text.usetex']:
- if labelstyle=='+/-':
- latlabstr = r'${\/+%s\/^{\circ}}$'%fmt
- else:
- latlabstr = r'${%s\/^{\circ}\/N}$'%fmt
+ if labelstyle=='+/-':
+ latlabstr = u'+%s\N{DEGREE SIGN}'%fmt
+ else:
+ latlabstr = u'%s\N{DEGREE SIGN}N'%fmt
+ latlab = latlabstr%lat
else:
- if labelstyle=='+/-':
- latlabstr = u'+%s\N{DEGREE SIGN}'%fmt
+ if rcParams['text.usetex']:
+ latlabstr = r'${%s\/^{\circ}}$'%fmt
else:
- latlabstr = u'%s\N{DEGREE SIGN}N'%fmt
- latlab = latlabstr%lat
- else:
- if rcParams['text.usetex']:
- latlabstr = r'${%s\/^{\circ}}$'%fmt
- else:
- latlabstr = u'%s\N{DEGREE SIGN}'%fmt
- latlab = latlabstr%lat
+ latlabstr = u'%s\N{DEGREE SIGN}'%fmt
+ latlab = latlabstr%lat
# parallels can intersect each map edge twice.
for i,n in enumerate([nl,nr]):
# don't bother if close to the first label.
@@ -1594,7 +1600,9 @@
but not the right and top.
labelstyle - if set to "+/-", east and west longitudes are labelled
with "+" and "-", otherwise they are labelled with "E" and "W".
- fmt is a format string to format the meridian labels (default '%g').
+ fmt can be is a format string to format the meridian labels
+ (default '%g') or a function that takes a longitude value
+ in degrees as it's only argument and returns a formatted string.
xoffset - label offset from edge of map in x-direction
(default is 0.01 times width of map in map projection coordinates).
yoffset - label offset from edge of map in y-direction
@@ -1721,42 +1729,45 @@
lons = [(lon+360) % 360 for lon in lons]
for lon in meridians:
# adjust so 0 <= lon < 360
- lon = (lon+360) % 360
+ lon2 = (lon+360) % 360
# find index of meridian (there may be two, so
# search from left and right).
- nl = _searchlist(lons,lon)
- nr = _searchlist(lons[::-1],lon)
+ nl = _searchlist(lons,lon2)
+ nr = _searchlist(lons[::-1],lon2)
if nr != -1: nr = len(lons)-nr-1
- if lon>180:
- if rcParams['text.usetex']:
- if labelstyle=='+/-':
- lonlabstr = r'${\/-%s\/^{\circ}}$'%fmt
+ try: # fmt is a function that returns a formatted string
+ lonlab = fmt(lon)
+ except: # fmt is a format string.
+ if lon2>180:
+ if rcParams['text.usetex']:
+ if labelstyle=='+/-':
+ lonlabstr = r'${\/-%s\/^{\circ}}$'%fmt
+ else:
+ lonlabstr = r'${%s\/^{\circ}\/W}$'%fmt
else:
- lonlabstr = r'${%s\/^{\circ}\/W}$'%fmt
- else:
- if labelstyle=='+/-':
- lonlabstr = u'-%s\N{DEGREE SIGN}'%fmt
+ if labelstyle=='+/-':
+ lonlabstr = u'-%s\N{DEGREE SIGN}'%fmt
+ else:
+ lonlabstr = u'%s\N{DEGREE SIGN}W'%fmt
+ lonlab = lonlabstr%npy.fabs(lon2-360)
+ elif lon2<180 and lon2 != 0:
+ if rcParams['text.usetex']:
+ if labelstyle=='+/-':
+ lonlabstr = r'${\/+%s\/^{\circ}}$'%fmt
+ else:
+ lonlabstr = r'${%s\/^{\circ}\/E}$'%fmt
else:
- lonlabstr = u'%s\N{DEGREE SIGN}W'%fmt
- lonlab = lonlabstr%npy.fabs(lon-360)
- elif lon<180 and lon != 0:
- if rcParams['text.usetex']:
- if labelstyle=='+/-':
- lonlabstr = r'${\/+%s\/^{\circ}}$'%fmt
- else:
- lonlabstr = r'${%s\/^{\circ}\/E}$'%fmt
+ if labelstyle=='+/-':
+ lonlabstr = u'+%s\N{DEGREE SIGN}'%fmt
+ else:
+ lonlabstr = u'%s\N{DEGREE SIGN}E'%fmt
+ lonlab = lonlabstr%lon2
else:
- if labelstyle=='+/-':
- lonlabstr = u'+%s\N{DEGREE SIGN}'%fmt
+ if rcParams['text.usetex']:
+ lonlabstr = r'${%s\/^{\circ}}$'%fmt
else:
- lonlabstr = u'%s\N{DEGREE SIGN}E'%fmt
- lonlab = lonlabstr%lon
- else:
- if rcParams['text.usetex']:
- lonlabstr = r'${%s\/^{\circ}}$'%fmt
- else:
- lonlabstr = u'%s\N{DEGREE SIGN}'%fmt
- lonlab = lonlabstr%lon
+ lonlabstr = u'%s\N{DEGREE SIGN}'%fmt
+ lonlab = lonlabstr%lon2
# meridians can intersect each map edge twice.
for i,n in enumerate([nl,nr]):
lat = lats[n]/100.
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins