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

基于netCDF数据绘制日期-海拔-振幅等高线图报错求解

报错原因与修复方案

核心错误原因

  • 数组结构不符合plt.contour的输入要求,具体有三个错误点:
    1. onemonth函数初始化时先给height_month、amplitude_month填充了31个0,后续循环又append了31天的结果,最终数组长度为62,和预期的31天结构完全不符,对应报错里的detected shape was (61,)提示
    2. oneday函数未在内部初始化height、amplitude列表,默认使用全局变量,每次调用会累积之前日期的数值,返回的长度远大于18,导致数组形状不均匀
    3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:54:03