You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键改动说明

  1. 替换插值函数:matplotlib.mlab.griddata已被官方标记为弃用,scipy.interpolate.griddata是更稳定的替代方案,语法也更清晰;
  2. 调整坐标逻辑:先在原始经纬度上生成网格并完成插值,再把网格转换为投影坐标,完全符合Basemapcontourf方法的输入要求;
  3. 解决警告问题:手动添加ax.hold(False),消除Matplotlib的弃用警告。

小补充:如果你的Basemap版本实在太老,长远来看建议考虑升级到cartopy(Basemap的官方替代库),不过上面的代码已经能解决你当前的报错啦。

内容的提问来源于stack exchange,提问作者Flavio D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:06:46