Basemap绘制插值网格报IndexError:1维数组被2维索引
问题背景
工作目标为对不同测站观测数据做空间插值,计算各年份插值网格的数值均值后完成可视化。
前期已完成操作:
- 编写
generate_grid函数生成经纬度网格,经Basemap投影转换后,通过inter_todf函数将插值结果展平为DataFrame并导出为CSV文件 - 完成多年网格数据均值计算,最终得到包含序号、纬度、经度、数值4个字段、共64800行的平均数据集
后续绘图阶段触发固定报错:
- 已完成
numpy/pandas/matplotlib/pykrige/Basemap等依赖导入 - 代码执行逻辑为:通过
load_data读取CSV数据,get_data提取经纬度与数值数组,prepare_map_plot初始化罗宾逊投影的Basemap画布,generate_grid完成坐标投影转换 - 在
plot_mesh_data中调用contourf绘制填色图时,持续触发报错:
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
报错栈指向Basemap库contourf方法内部的xx = x[x.shape[0]//2,:]语句,需排查问题完成网格数据正确绘制,输出标准全球插值填色图。
报错根因
Basemap的contourf方法要求传入的x、y坐标必须是与z值维度匹配的二维网格数组。
前期导出CSV时通过inter_todf将二维插值网格展平为一维表格,读取后提取的经纬度、数值数组均为一维结构,直接传入contourf时,方法内部尝试按二维数组规则对x做行切片(即报错栈中的xx = x[x.shape[0]//2,:]操作),就会触发维度不匹配的索引错误。
注:64800行的数据集刚好对应1°分辨率的全球等经纬度网格:纬度方向180个格点(覆盖-90°90°)、经度方向360个格点(覆盖-180°180°),总网格数180*360=64800,可直接按该维度做数组重构。
修复方案
- 读取CSV后先对数据按纬度、经度排序,再将一维数组重构为二维网格结构,参考代码:
import pandas as pd import numpy as np from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt # 读取均值数据 df = pd.read_csv("your_average_grid_data.csv") # 按纬度、经度升序排序,保证格点顺序匹配网格结构,避免绘图错位 df = df.sort_values(by=["纬度", "经度"]).reset_index(drop=True) # 按1°全球网格维度重构数组 n_lat = 180 n_lon = 360 lon_2d = df["经度"].values.reshape(n_lat, n_lon) lat_2d = df["纬度"].values.reshape(n_lat, n_lon) z_2d = df["数值"].values.reshape(n_lat, n_lon)
- 完成投影转换后调用
contourf绘图,参考代码:
# 初始化罗宾逊投影画布 plt.figure(figsize=(12, 6), dpi=100) m = Basemap(projection="robin", lon_0=0, resolution="c") # 二维网格坐标投影转换 x, y = m(lon_2d, lat_2d) # 绘制填色等值图 contour_plot = m.contourf(x, y, z_2d, cmap="RdBu_r", levels=20) # 叠加基础地理要素 m.drawcoastlines(linewidth=0.5) m.drawcountries(linewidth=0.3) m.drawparallels(np.arange(-90, 91, 30), labels=[1,0,0,0], fontsize=8) m.drawmeridians(np.arange(-180, 181, 60), labels=[0,0,0,1], fontsize=8) # 添加色标与标题 cbar = m.colorbar(contour_plot, location="bottom", pad="8%") cbar.set_label("多年平均观测值", fontsize=10) plt.title("全球观测值多年平均空间分布", fontsize=12) plt.show()
- 若重构后绘图出现格点错位,可打印
lon_2d[0,:]、lat_2d[:,0]校验经纬度的升降序,调整排序规则即可。
内容的提问来源于stack exchange,提问作者Weiss
相关产品推荐
相关产品推荐

