2015-05-20 3 views
0

Я могу получить свой сюжет, чтобы анимировать правильно и отображать то, что мне нужно. Однако, когда я запускаю свою программу, я получаю серию ошибок, которые не влияют на программу, с которой я бы хотел справиться.MatPlotLib RTE xdata и ydata должны быть одинаковой длины

Ошибка возвращается к 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

Пожалуйста, не используйте 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] в код выше.

+0

Использование CurrentXAxis = np.arange (len (values1) -100, len (values1), 1) ax.axis ([CurrentXAxis.min(), CurrentXAxis.max(), -10, 10]) I ' m, чтобы получить весь график, чтобы следовать с линиями. как бы вы могли перемещать ось x с помощью вашего примера? – user3524785

+0

Я еще не начал работу над тем, что мне хотелось бы, чтобы X Axis действительно была на самом деле, это были последние 10-е данные. Я просто использую ряд данных, которые я собрал из одного из своих массивов, чтобы определить, сколько можно показать. если это поможет вам понять, что я пытаюсь сделать. – user3524785

+0

Я просто отказался от переопределения границ оси – tacaswell

Смежные вопросы