Basemap绘制格点数据Contourf零尺寸数组报错解决方法
问题根因
你遇到的ValueError: zero-size array to reduction operation maximum报错,核心是传给contourf的数值数组和网格坐标维度完全不匹配,代码存在3个明确的逻辑错误:
- 数据加载逻辑错误:
load_data函数仅读取了Value列,后续要用到的经度、纬度字段根本没有被加载,且全程未调用get_data函数,直接把仅含单列的DataFrame作为Z值传入绘图函数,和生成的二维网格维度完全无法对齐。 - 网格生成逻辑无效:
generate_grid函数开头先对未定义的grid变量赋值,紧接着又重新初始化grid字典直接覆盖了前面的赋值,前两行linspace相关代码完全不生效;且调用时传入delta=90,生成的经纬度网格点数极少,也会触发维度异常。 - 数据维度未做对齐:
contourf要求传入的X、Y坐标网格和Z值数组必须是维度完全一致的二维数组,传入的df是一维单列结构,不满足绘图接口的参数要求。
格点数据处理说明
如果你的CSV存储的是严格对齐规则格点的全球数据(即经纬度按固定步长均匀排列、无缺失点),不需要额外做插值处理,只需要把一维的数值数组按网格维度reshape为二维数组即可;如果CSV存储的是离散站点、非规则排列的散点数据,才需要用已导入的克里金插值或者其他插值方法,把散点值插值到规则网格上再绘图。
修正后的参考代码
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.basemap import Basemap import pandas as pd def load_data(): # 替换为你的实际文件路径,确保读取全部需要的字段 df = pd.read_csv(r"your_file_path.csv", usecols=['Longitude', 'Latitude', 'Value']) return df def generate_grid(basemap, delta=1): # 按指定步长生成全球经纬度网格,避开极点避免投影异常 lon_grid = np.arange(-180, 180, delta) lat_grid = np.arange(-89.9, 89.9, delta) lon2d, lat2d = np.meshgrid(lon_grid, lat_grid) # 经纬度转地图投影坐标 x2d, y2d = basemap(lon2d, lat2d) return x2d, y2d, lon_grid, lat_grid def prepare_map_plot(): figure, axes = plt.subplots(figsize=(10,10)) basemap = Basemap(projection='robin', lon_0=0, lat_0=0, resolution='l', area_thresh=1000000, ax=axes) basemap.drawcoastlines() basemap.drawparallels(np.arange(-90.,120.,30.)) basemap.drawmeridians(np.arange(0.,420.,60.)) return figure, axes, basemap def plot_mesh_data(z2d, x2d, y2d, basemap): colormesh = basemap.contourf(x2d, y2d, z2d, 32, cmap='RdBu_r') basemap.colorbar(colormesh, location='bottom', pad="10%") if __name__ == "__main__": df = load_data() figure, axes, basemap = prepare_map_plot() # 按需调整delta值,数值越小分辨率越高,绘图速度越慢 x2d, y2d, lon_grid, lat_grid = generate_grid(basemap, delta=2.5) # 规则格点数据用这段:按网格维度把一维value转成二维数组,如果值和网格错位,先把df按纬度降序、经度升序排序再取值 z2d = df['Value'].values.reshape((len(lat_grid), len(lon_grid))) # 散点/非规则格点数据注释掉上面的reshape行,启用这段插值逻辑 # from scipy.interpolate import griddata # points = np.array([df['Longitude'], df['Latitude']]).T # values = df['Value'].values # grid_lon, grid_lat = np.meshgrid(lon_grid, lat_grid) # z2d = griddata(points, values, (grid_lon, grid_lat), method='linear') plot_mesh_data(z2d, x2d, y2d, basemap) plt.show()
提示:如果reshape后绘图出现值和地理位置错位的问题,先确认CSV内格点的排列顺序和
meshgrid生成的维度顺序一致,排序后再做维度转换即可。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

