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

时间:2015-05-20 00:06:09

标签: python matplotlib graph runtime-error

我能够让我的情节正确地制作动画并展示我需要的东西。但是,当我启动我的程序时,我得到一系列不会影响程序的错误,我想处理它。

错误返回到manager.canvas.draw,其中MatPlotLib会发出几百行错误,然后停止,然后一切正常。

\ matplotlib \ lines.py“,第595行,处于重新缓存状态     引发RuntimeError('xdata和ydata必须是相同的长度')

是每次通话中的最后一次

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

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()

1 个答案:

答案 0 :(得分:1)

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

问题在于len(values1) < 100 CurrentXAxis values的长度为100,但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(...)

如果将图表捕获为

,也可以使其更具可读性
,

请注意[0]将长度1列表解压缩为单个值,这样您就可以删除上面代码中的{{1}}。