不久前我遇到了同样的问题,这是我能想到的唯一解决方案:
(请注意,这适用于 matplotlib 1.3.0,但不适用于 1.1.0)
from mpl_toolkits.basemap import Basemap
import numpy.ma as ma
import numpy as np
m = Basemap() #Define your map projection here
假设 var 是您感兴趣的变量 (NxMx3),lats 是 (N)x(M),lons 是 (N)x(M):
我们需要将像素中心的纬度/经度转换为像素角的经度/经度 (N+1)x(M+1)
cornerLats=getCorners(lat);cornerLons=getCorners(lon)
获取坐标角
xCorners,yCorners=m(cornerLats,cornerLons,inverse=True)
屏蔽无效数据
var=ma.masked_where(np.isnan(var),var)
我们需要一个扁平的元组(N*M,3) 来传递给 pcolormesh
colorTuple=tuple(np.array([var[:,:,0].flatten(),var[:,:,1].flatten(),var[:,:,2].flatten()]).transpose().tolist())
设置较大的线宽会导致更多的边缘变形,而一个
由于某种原因,较小的线宽会导致图像出错。
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