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

如何修复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的初始化改为直接创建单元素数组,和其他数组保持一致:
    # 替换原初始化代码
    gyroArr2 = np.array([6.324555320336759])
    gyroArr3 = np.array([6.324555320336759])
    
    修复后,两个数组初始长度为1,循环10次后总长度11,和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)
      

3. 调试与优化建议

  • 绘图前添加长度检查:print(len(paramArr), len(GrArr)),快速确认数组长度是否一致。
  • 避免循环中使用np.append,效率极低。建议预先初始化固定大小的数组,比如dtArr = np.zeros(11),再通过索引赋值。

内容的提问来源于stack exchange,提问作者jazzyxbee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:05:22