如何修复Matplotlib散点图的‘x和y必须尺寸相同’错误?
问题描述
我是Python新手,绘制散点图时遇到ValueError: x and y must be the same size错误。基于dtArr的散点图能正常生成,但基于磁场数组fieldArr和电荷数组chargeArr的绘图失败。以下是相关代码及完整报错栈,了解过数组重塑但无法理解,求解决方法。
散点图代码
def plotNumericalConvergence(paramArr, GrArr, Label): plt.figure() x = paramArr y = GrArr plt.scatter(x=x,y=y) plt.xlabel(Label) plt.ylabel('Gr') plt.title('title') plt.show()
数据输入代码
def numericalConvergence(Position, Velocity, Charge, Mass, dt, B): gyroArr = np.array([]) gyroArr2 = np.array([]) gyroArr3 = np.array([]) dtArr = np.array([]) fieldArr = np.array([]) chargeArr = np.array([]) dtArr = np.append(dtArr, [dt]) gyroArr = np.append(gyroArr, [6.324555320336759]) gyroArr2 = np.append(gyroArr, [6.324555320336759]) gyroArr3 = np.append(gyroArr, [6.324555320336759]) fieldArr = np.append(fieldArr, [[0,0,1]]) chargeArr = np.append(chargeArr, Charge) # Incrementing timestep for i in range (10): start = time.time() dt = dt + 0.1000 print('\n"Timestep", i+1) trv= pstep(qom,Position,Velocity,0.0,dt,N_t) Gr = MeasuredGr(trv) PredGr = GyroRadius(Position, Velocity, Charge, Mass, dt, B) gyroArr = np.append(gyroArr, [Gr]) dtArr = np.append(dtArr, [dt]) end = time.time() print("Predicted gyro radius =", PredGr) print("Measured gryo radius =", Gr) print("Timestep =", dt) print("Magnetic Field =", B) print("Charge =", Charge) print("nt =",(end - start)/dt) Label = "DT" plotNumericalConvergence(dtArr, gyroArr, Label) # Incrementing magnetic field for i in range (10): start = time.time() dt=0.001 B = [float(x) + 1 for x in B] print('\n"Magnetic Field", i+1) trv = pstep(qom,Position,Velocity,0.0,dt,N_t) Gr = MeasuredGr(trv) PredGr = GyroRadius(Position, Velocity, Charge, Mass, dt, B) gyroArr2 = np.append(gyroArr2, [Gr]) fieldArr = np.append(fieldArr, [[B]]) end = time.time() print("Predicted gyro radius =", PredGr) print("Measured gryo radius =", Gr) print("Timestep =", dt) print("Magnetic Field =", B) print("Charge =", Charge) print("nt =",(end - start)/dt) Label = "Magnetic Field" plotNumericalConvergence(fieldArr, gyroArr2, Label) # Incrementing Charge for i in range (10): start = time.time() B = [0,0,1] Charge = Charge + 0.1 print('\n"Charge", i+1) trv=pstep(qom,Position,Velocity,0.0,dt,N_t) Gr = MeasuredGr(trv) PredGr = GyroRadius(Position, Velocity, Charge, Mass, dt, B) gyroArr3 = np.append(gyroArr3, [Gr]) chargeArr = np.append(chargeArr, [Charge]) print("Predicted gyro radius =", PredGr) print("Measured gryo radius =", Gr) print("Timestep =", dt) print("Magnetic Field =", B) print("Charge =", Charge) print("nt =",(end - start)/dt) Label = "Charge" print(gyroArr3) print(chargeArr) plotNumericalConvergence(chargeArr, gyroArr3, Label)
完整报错栈
ValueError Traceback (most recent call last) Cell In [249], line 25 22 bf=EvalB(ipos) 23 vel = Boris(qom,ivel,ef,bf,-0.5*dt) ---> 25 numericalConvergence(ipos, vel, Charge, Mass, dt, B) Cell In [246], line 101, in numericalConvergence(Position, Velocity, Charge, Mass, dt, B) 99 print(gyroArr3) 100 print(chargeArr) --> 101 plotNumericalConvergence(chargeArr, gyroArr3, Label) Cell In [247], line 8, in plotNumericalConvergence(paramArr, GrArr, Label) 5 x = paramArr 6 y = GrArr ----> 8 plt.scatter(x=x,y=y) ... ValueError: x and y must be the same size
解决方法
1. 核心问题:数组长度不匹配
- 错误原因:
gyroArr2、gyroArr3初始化时基于已有gyroArr(长度1)追加元素,导致初始长度为2;而fieldArr、chargeArr初始长度为1。循环10次后,gyroArr2/gyroArr3总长度为12,fieldArr/chargeArr总长度为11,两者长度不匹配触发报错。 - 修复代码:
将gyroArr2、gyroArr3的初始化改为直接创建单元素数组,和其他数组保持一致:
修复后,两个数组初始长度为1,循环10次后总长度11,和# 替换原初始化代码 gyroArr2 = np.array([6.324555320336759]) gyroArr3 = np.array([6.324555320336759])fieldArr、chargeArr长度完全匹配。
2. 磁场数组维度问题
- 错误原因:
fieldArr = np.append(fieldArr, [[B]])会生成嵌套维度的数组(三维),而plt.scatter要求x轴为一维数组(每个数据点对应一个数值)。 - 修复方案:
根据需求选择以下一种方式:- 提取磁场的单个分量(比如z分量)作为x轴:
# 初始化 fieldArr = np.array([B[2]]) # 循环内追加 fieldArr = np.append(fieldArr, B[2]) - 计算磁场的模长作为x轴:
import numpy as np # 初始化 field_mag = np.linalg.norm(B) fieldArr = np.array([field_mag]) # 循环内追加 field_mag = np.linalg.norm(B) fieldArr = np.append(fieldArr, field_mag)
- 提取磁场的单个分量(比如z分量)作为x轴:
3. 调试与优化建议
- 绘图前添加长度检查:
print(len(paramArr), len(GrArr)),快速确认数组长度是否一致。 - 避免循环中使用
np.append,效率极低。建议预先初始化固定大小的数组,比如dtArr = np.zeros(11),再通过索引赋值。
内容的提问来源于stack exchange,提问作者jazzyxbee
相关产品推荐
相关产品推荐

