基于netCDF数据绘制日期-海拔-振幅等高线图报错求解
报错原因与修复方案
核心错误原因
- 数组结构不符合
plt.contour的输入要求,具体有三个错误点:onemonth函数初始化时先给height_month、amplitude_month填充了31个0,后续循环又append了31天的结果,最终数组长度为62,和预期的31天结构完全不符,对应报错里的detected shape was (61,)提示oneday函数未在内部初始化height、amplitude列表,默认使用全局变量,每次调用会累积之前日期的数值,返回的长度远大于18,导致数组形状不均匀plt.contour要求输入的X(日期)、Y(海拔)、Z(振幅)三个参数必须是形状一致的二维数组,你当前的列表结构不符合要求
修复步骤
第一步:修复oneday函数,每次调用返回当日的18组数据
修改后代码:
def sine_func(x, a): return a * np.sin((np.pi / 180) * x) def oneday(data): # 每次调用初始化空列表,避免累积之前的结果 height = [] amplitude = [] for i in range(0,36,2): zonal = data.u.values[4][36-i][-68][0:359] longitude = data.lon[0:359] z = data.z.values[4][36-i][-68][292] popt, pcov = scipy.optimize.curve_fit(sine_func, longitude, zonal) height.append(z) amplitude.append(abs(popt[0])) return height, amplitude
第二步:修复onemonth函数,生成正确结构的月数据
修改后代码:
def onemonth(datalist): height_month = [] amplitude_month = [] for k in range(len(datalist)): dat = xr.open_dataset(datalist[k]) height, amplitude = oneday(dat) height_month.append(height) amplitude_month.append(amplitude) # 转成形状为(31,18)的numpy数组,符合contour输入要求 return np.array(height_month), np.array(amplitude_month)
第三步:生成匹配的日期数组并绘图
如果你的daysjan已经是形状为(31,18)的数组可以直接用,否则可以直接用numpy生成:
height_jan, amplitude_jan = onemonth(jan) # 生成形状(31,18)的日期数组,每一行都是对应日的编号 daysjan = np.repeat(np.arange(1,32)[:, np.newaxis], 18, axis=1) plt.contour(daysjan, height_jan, amplitude_jan) plt.xlabel("日期(1月)") plt.ylabel("海拔") plt.colorbar(label="振幅") plt.show()
内容的提问来源于stack exchange,提问作者sj123
相关产品推荐
相关产品推荐

