如何在Basemap上绘制插值后的站点降水数据?报错修复咨询
修复Basemap绘制插值降水图的IndexError问题
嘿,我来帮你搞定这个Basemap的报错问题!先拆解下你遇到的核心问题:
- 开头的MatplotlibDeprecationWarning是因为老版本Basemap和新版Matplotlib的hold机制不兼容,属于警告不影响运行;
- 后面的IndexError才是导致程序崩溃的关键,本质有两个原因:一是你传给
m.contourf的是投影后的坐标,但Basemap的contourf默认期望输入原始地理坐标(lon/lat);二是老版本Basemap在Python3环境下,用x.shape[0]/2会得到浮点数,而数组索引必须是整数。
接下来直接上修复方案:
核心修复点
- 替换已被弃用的
matplotlib.mlab.griddata,改用scipy.interpolate.griddata(功能更稳定,兼容Python3) - 插值操作基于原始经纬度(lon/lat),而非投影后的坐标
- 把插值生成的网格转换为Basemap投影坐标后,再传递给
contourf
完整修复代码
import numpy as np import pandas as pd from scipy.interpolate import griddata # 替换mlab的过时griddata from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt from matplotlib.colors import Normalize fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111) # 读取降水数据 data = pd.read_csv('.../rainfall-2010-12.txt', na_values=['NaN'], sep=',') # 设置地图范围(基于原始经纬度) lllon = data['lon'].min() lllat = data['lat'].min() urlon = data['lon'].max() urlat = data['lat'].max() # 初始化Basemap地图 m = Basemap( projection='merc', llcrnrlon=lllon, llcrnrlat=lllat, urcrnrlon=urlon, urcrnrlat=urlat, resolution='h' ) # 生成原始经纬度网格 numcols, numrows = 300, 300 xi = np.linspace(lllon, urlon, numcols) yi = np.linspace(lllat, urlat, numrows) xi, yi = np.meshgrid(xi, yi) # 执行插值(用原始经纬度和降水量数据) x, y, z = data['lon'].values, data['lat'].values, data['rain'].values zi = griddata((x, y), z, (xi, yi), method='linear') # 将插值后的网格转换为Basemap投影坐标 xi_proj, yi_proj = m(xi, yi) # 绘制等高填色图 conf = m.contourf(xi_proj, yi_proj, zi, zorder=4, alpha=0.6, cmap='RdPu') # 完善地图元素 m.drawcoastlines() cbar = plt.colorbar(conf, orientation='horizontal', fraction=.057, pad=0.05) cbar.set_label("Rainfall - mm") plt.title("Rainfall") # 关闭hold机制,消除Matplotlib弃用警告 ax.hold(False) plt.show()
关键改动说明
- 替换插值函数:
matplotlib.mlab.griddata已被官方标记为弃用,scipy.interpolate.griddata是更稳定的替代方案,语法也更清晰; - 调整坐标逻辑:先在原始经纬度上生成网格并完成插值,再把网格转换为投影坐标,完全符合Basemap
contourf方法的输入要求; - 解决警告问题:手动添加
ax.hold(False),消除Matplotlib的弃用警告。
小补充:如果你的Basemap版本实在太老,长远来看建议考虑升级到cartopy(Basemap的官方替代库),不过上面的代码已经能解决你当前的报错啦。
内容的提问来源于stack exchange,提问作者Flavio D
相关产品推荐
相关产品推荐

