我能够让我的情节正确地制作动画并展示我需要的东西。但是,当我启动我的程序时,我得到一系列不会影响程序的错误,我想处理它。
错误返回到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()
答案 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}}。