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) < 100
你 CurrentXAxis
的长度为 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]
。
我能够让我的情节正确地制作动画并显示我需要的内容。然而,当我启动我的程序时,我收到了一系列不影响程序的错误,我想处理这些错误。
错误又回到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) < 100
你 CurrentXAxis
的长度为 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]
。