如何解决将imshow与底图配合使用:颜色和地图边框之间不匹配
我正在尝试使用底图绘制一些grib数据 和imshow而不是contourf。当用contourf绘制时,我得到了适当的边界和颜色,但是当用imshow绘制时,图像和地图之间却不匹配。 使用contourf using contourf进行绘图。使用imshow using imwshow
进行绘图我正在使用lcc投影。在文档中,我看到了一些使用圆柱投影的示例,但是在这种情况下,我也会出现不匹配的情况。 相关代码如下。
m = Basemap(llcrnrlon=-55,llcrnrlat=55.8,urcrnrlon=80,urcrnrlat=80,lat_1=72,lat_0=72.,lon_0=-36,resolution='h',projection='lcc')
x,y = m(lons,lats)
data = data - 273.15
import matplotlib as mpl
cmap = mpl.cm.RdBu_r
norm = mpl.colors.normalize(vmin=-55,vmax=15)
minVal = min(data.flatten())
maxVal = max(data.flatten())
clev = np.arange(minVal,maxVal,0.01)
#using contourf
CS_tmp = m.contourf(x,y,data,clev,cmap=plt.cm.coolwarm)
#using imshow
CS_tmp = m.imshow(data2,cmap=cmap) #,extent=extent)
我的问题是,我应该应用哪种转换 数据?我试图按照本教程 https://basemaptutorial.readthedocs.io/en/latest/utilities.html#interp 它引用了transform_scalar,这只会起作用 用于圆柱投影。
建议对非圆柱投影使用interp “当输入矩阵的经纬度不规则(即不是圆柱投影)时,由于经纬度网格不规则,因此无法正确使用此方法。有关解决方案,请参见插值示例。 “
我尝试按照那里的示例进行操作,但这没有用 而且我仍然看到不匹配
x2 = np.linspace(x[0][0],x[0][-1],x.shape[1]*2)
y2 = np.linspace(y[0][0],y[-1][0],y.shape[0]*2)
x2,y2 = np.meshgrid(x2,y2)
data_trans = interp(data,x[0],y[:,0],x2,y2,order=1)
谁能告诉我这里适当的转变是什么?
感谢您的帮助
卡洛斯
解决方法
我认为问题在于imshow图适合您图中的整个图形窗口,因为matplotlib无法从数组中获取任何坐标信息。
如果您要使用其他投影,则可以正确设置边界,但是当您使用基于极坐标的投影时,坐标的范围在纬度和经度上会高达80°。
因此,您必须将nan添加到data2
数组中。
代码可能看起来像这样:
# take a raw array of zeros along longitude axes
base_nan_array = np.zeros(len(x))
# find out how many rows must be added
n_lat_rows =len(y) - data2.shape[1]
# fill up nan array
nan_array = np.array([base_nan_array,]*n_lat_rows)
# append to data (you have to find the direction of append on your own bc. no test data is avail.)
np.append([data2,nan_array],axis=0)
这将使您的数组覆盖底图的整个范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。