MatPlotLib RTE xdata 和 ydata 的长度必须相同

MatPlotLib RTE xdata and ydata must be same length

我能够让我的情节正确地制作动画并显示我需要的内容。然而,当我启动我的程序时,我收到了一系列不影响程序的错误,我想处理这些错误。

错误又回到manager.canvas.draw,MatPlotLib 喷出几百行错误,然后停止,然后一切正常。

\matplotlib\lines.py”,第 595 行,在重新缓存中 提高 RuntimeError('xdata and ydata must be the same length')

是每次调用的最后一个

这里是受影响的代码片段(不包括整个程序):

xachse=pylab.arange(0,100,1)
yachse=pylab.array([0]*100)

xachse2=pylab.arange(0,100,1)
yachse2=pylab.array([0]*100)

xachse3=pylab.arange(0,100,1)
yachse3=pylab.array([0]*100)

fig = pylab.figure(1)

ax = fig.add_subplot(111)

ax.grid(True)
ax.set_title("Realtime Pulse Plot")
ax.set_xlabel('time')
ax.set_ylabel('Voltage')
ax.axis([0,100,-10,10])
line1= ax.plot(xachse,yachse,'-', label="AIO6")
line2= ax.plot(xachse2,yachse2,'-', label="DAC0")
line3= ax.plot(xachse3,yachse3,'-', label="DAC1")

ax.legend()

manager = pylab.get_current_fig_manager()

def Voltage(arg):
    global values1,values2,values3, ain6, d, DAC0, DAC1
    ain6 = d.getAIN(6)
    DAC0 = d.readRegister(5000)
    DAC1 = d.readRegister(5002)
    values3.append(DAC1)
    values1.append(ain6)
    values2.append(DAC0)


def RealtimePloter(arg):
    global values1, values2, values3, manager, line1, line2,line3
    CurrentXAxis=pylab.arange(len(values1)-100, len(values1),1)
    line1[0].set_data(CurrentXAxis,pylab.array(values1[-100:]))
    line2[0].set_data(CurrentXAxis,pylab.array(values2[-100:]))
    line3[0].set_data(CurrentXAxis,pylab.array(values3[-100:]))
    ax.axis([CurrentXAxis.min(),CurrentXAxis.max(), -10, 10])
    manager.canvas.draw()

timer =fig.canvas.new_timer(interval=10)
timer.add_callback(RealtimePloter, ())
timer2 = fig.canvas.new_timer(interval=10)
timer2.add_callback(Voltage, ())
pylab.show()

请不要使用pylab,它是plt和numpy的一个非常混乱的命名空间,最好直接从它们的源代码中使用。

问题是当 len(values1) < 100CurrentXAxis 的长度为 100,但你的 values 数组的长度更短。

import numpy as np

def RealtimePloter(arg):
    # globals are bad form, as you are not modifying the values in here
    # doing this with a closure is probably good enough
    global values1, values2, values3, manager, line1, line2, line3

    len_v = len(values1)
    # notice the `max` call, could also use np.clip
    x = np.arange(np.max([0, len_v - 100]), len_v)
    for ln, y in zip((line1, line2, line3), (values1, values2, values3)):
        ln[0].set_data(x, np.asarray(y[-100:]))
    ax.set_xlim([x[0], x[-1]])


    manager.canvas.draw()

如果将绘图捕获为

,还可以使它更具可读性
ln1, = ax.plot(...)

请注意 , 将长度为 1 的列表解压缩为单个值,因此您可以删除上面代码中的 [0]