I ran into this problem some time ago, and this is the only solution I could come up with:
(Note that this works with matplotlib 1.3.0 , but not with 1.1.0 )
from mpl_toolkits.basemap import Basemap import numpy.ma as ma import numpy as np m = Basemap()
Assuming var is your variable of interest (NxMx3), lats is (N) x (M) and lons (N) x (M):
We need to convert the pixel centers lat / lons to the pixel angles lat / lons (N + 1) x (M + 1)
cornerLats=getCorners(lat);cornerLons=getCorners(lon)
Get coordinate angles
xCorners,yCorners=m(cornerLats,cornerLons,inverse=True)
Mask of invalid data
var=ma.masked_where(np.isnan(var),var)
We need a flattened tuple (N * M, 3) to go to pcolormesh
colorTuple=tuple(np.array([var[:,:,0].flatten(),var[:,:,1].flatten(),var[:,:,2].flatten()]).transpose().tolist())
Setting a larger line width will result in more distortion of the edge and
a smaller line width will result in a twisted image for some reason.
m.pcolormesh(xCorners,yCorners,var[:,:,0],color=colorTuple,clip_on=True,linewidth=0.05) def getCorners(centers): one = centers[:-1,:] two = centers[1:,:] d1 = (two - one) / 2. one = one - d1 two = two + d1 stepOne = np.zeros((centers.shape[0] + 1,centers.shape[1])) stepOne[:-2,:] = one stepOne[-2:,:] = two[-2:,:] one = stepOne[:,:-1] two = stepOne[:,1:] d2 = (two - one) / 2. one = one - d2 two = two + d2 stepTwo = np.zeros((centers.shape[0] + 1,centers.shape[1] + 1)) stepTwo[:,:-2] = one stepTwo[:,-2:] = two[:,-2:] return stepTwo