我正在使用Matplotlib和basemap在地图上绘制网格数据。我正在比较使用pcolormesh方法和散点图的区别,使用的代码如下:
我得到的情节看起来像这样: 注意,经纬度坐标对应于每个网格框的左下角。这是设计意图还是 bug?我认为这是设计意图,但是我看到的所有示例(http://matplotlib.org/basemap/users/examples.html)都没有提及它。我希望网格单元格以经纬度坐标点为中心,这些经纬度坐标点本身位于不规则网格上(lons、lats变量是2D数组)。如何实现这一点?
nb. 这里的数据变量只是对应于 ones 或 nans 的掩码。
谢谢。
编辑:根据 Tom 的建议,如果我尝试使用 contourf,我会得到以下图像(缩放近似于第一张图像)。 它仍然无法很好地处理边缘,因为它不能在有限值和NaN之间绘制表面,因此存在许多缺失点。我希望每个网格单元都能被渲染。似乎imshow可以实现我的需求,但这似乎只适用于规则(线性)网格。
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
# setup of basemap ('lcc' = lambert conformal conic).
# use major and minor sphere radii from WGS84 ellipsoid.
m = Basemap(width=12000000,height=9000000,
rsphere=(6378137.00,6356752.3142),\
resolution='l',area_thresh=1000.,projection='lcc',\
lat_1=projection['standard_parallel'][0],\
lat_2=projection['standard_parallel'][1],\
lat_0=projection['latitude_of_projection_origin'],\
lon_0=projection['longitude_of_central_meridian'])
x, y = m(lons, lats) # compute map proj coordinates.
# draw coastlines and political boundaries.
m.drawcoastlines()
m.drawcountries()
m.drawstates()
# draw parallels and meridians.
# label on left and bottom of map.
parallels = np.arange(0.,80,20.)
m.drawparallels(parallels,labels=[1,0,0,1])
meridians = np.arange(10.,360.,30.)
m.drawmeridians(meridians,labels=[1,0,0,1])
#cs = m.pcolormesh(x,y,data)
cs = m.pcolormesh(x,y,data,shading='flat',cmap=plt.cm.rainbow)
cb = m.colorbar(cs,"right", size="5%", pad='2%', ticks=V[0::5])
m.scatter(x*data,y*data, marker='.', s=100, c='g')
ax.set_title(title)
plt.show(block=False)
我得到的情节看起来像这样: 注意,经纬度坐标对应于每个网格框的左下角。这是设计意图还是 bug?我认为这是设计意图,但是我看到的所有示例(http://matplotlib.org/basemap/users/examples.html)都没有提及它。我希望网格单元格以经纬度坐标点为中心,这些经纬度坐标点本身位于不规则网格上(lons、lats变量是2D数组)。如何实现这一点?
nb. 这里的数据变量只是对应于 ones 或 nans 的掩码。
谢谢。
编辑:根据 Tom 的建议,如果我尝试使用 contourf,我会得到以下图像(缩放近似于第一张图像)。 它仍然无法很好地处理边缘,因为它不能在有限值和NaN之间绘制表面,因此存在许多缺失点。我希望每个网格单元都能被渲染。似乎imshow可以实现我的需求,但这似乎只适用于规则(线性)网格。