如何修复Python绘图中‘x与y首维度不匹配((192,)和(1,))’报错?
问题原因与修复方案
核心问题
- 函数调用错误:你在
plt.plot和plt.errorbar中直接使用了cw_signal(函数对象),而非调用函数获取计算后的数组。此时cw_signal是函数引用,不是长度为192的数组,自然和t的维度不匹配。 - 函数参数冗余:
cw_signal定义了amp, f, t, phi参数,但函数内部直接覆盖了这些参数的值,导致外部传入的参数完全失效,失去了封装的意义。
修复步骤
方案1:保留函数参数灵活性
修改函数,移除内部硬编码,使用外部传入的参数计算:
import math import numpy as np import matplotlib.pyplot as plt def cw_signal(amp, f, t, phi): seconds_per_day = 24*60*60 return amp*np.cos(2*np.pi*f * seconds_per_day*t + phi) # 定义参数 amp = 2e-6 f = 3e-9 phi = math.pi / 2 t = np.linspace(53005, 58849, 192) residuals = np.zeros(192) wn = 1e-6 residuals += wn*np.random.randn(192) # 调用函数获取计算后的数组 cw_data = cw_signal(amp, f, t, phi) plt.plot(t, cw_data, marker='.', ls='', label='cw') plt.errorbar(t, cw_data + residuals, marker='.', yerr=wn, ls='', label='cw+residuals') plt.xlabel('MJD') plt.legend() plt.tight_layout() plt.show()
方案2:简化函数(无需外部参数)
如果不需要外部控制参数,直接移除函数参数,内部定义所有变量:
import math import numpy as np import matplotlib.pyplot as plt def cw_signal(): seconds_per_day = 24*60*60 amp = 2e-6 f = 3e-9 phi = math.pi / 2 t = np.linspace(53005, 58849, 192) return amp*np.cos(2*np.pi*f * seconds_per_day*t + phi), t # 调用函数获取数据和时间轴 cw_data, t = cw_signal() residuals = np.zeros(192) wn = 1e-6 residuals += wn*np.random.randn(192) plt.plot(t, cw_data, marker='.', ls='', label='cw') plt.errorbar(t, cw_data + residuals, marker='.', yerr=wn, ls='', label='cw+residuals') plt.xlabel('MJD') plt.legend() plt.tight_layout() plt.show()
关键说明
- 调用函数必须加括号(如
cw_signal(amp, f, t, phi)),才能执行函数并返回计算后的数组。 - 函数参数要么用于接收外部输入,要么直接移除,避免冗余代码造成混淆。
内容的提问来源于stack exchange,提问作者Jack6647
相关产品推荐
相关产品推荐

