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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:18:09