Простой график matplotlib.animation становится медленнее и быстрее, чем останавливается - PullRequest
0 голосов
/ 01 ноября 2018

Я начал изучать функции matplotlib, потому что хотел визуализировать данные, которые я получал через websocket. Для этого я создал фиктивную программу, которая имитирует поведение моей основной программы, но добавил функциональность mathplotlib. Что я заметил, так это то, что программе требуется все больше и больше времени, чтобы завершить каждый цикл и в конечном итоге «зависает». Мне удалось продлить срок его службы, изменив interval в animation.FuncAnimation с 1000 на 10000. Но это просто программа для построения графика иногда до 9 секунд для 1 нового набора данных. Я считаю, что проблема заключается в неуместном способе очистки старых участков. Но я не знаю, где именно я совершил ошибку

import time
import datetime
import timeit
import queue
import os
import random
import copy
import matplotlib.pyplot as plt
import matplotlib.animation as animation

q = queue.Queue()
beta=[0,]
b=False
czas=[]
produkty=["primo"]
cena=[[] for _ in range(len(produkty))]


fig=plt.figure()
#ax1=fig.add_subplot(1,1,1)
#ax2=fig.add_subplot(1,1,1)
ax1=plt.subplot(1,1,1)
ax2=plt.subplot(1,1,1)
def animate(i):
    ax1.clear()
    ax2.clear()
    ax1.plot(czas,cena[0])
    ax2.plot(czas,beta)


while True:
    time.sleep(1)
    alpfa=time.time()
    #input('press enter')
    rand_produkt=random.choice(produkty) 
    rand_price=random.randint(1,10)
    rand_czas=time.ctime()
    alfa={'type':'ticker','price':rand_price,'product_id':rand_produkt,'time':rand_czas}
    q.put(alfa)
    if q.not_empty:            
        dane=q.get()        
        typ=dane.get('type',None)
        if typ=='ticker':
            price=dane.get('price', None)
            pair=dane.get('product_id',None)
            t=dane.get('time', None)
            b=True
    if b==True:
        b=False

        produkt_id=produkty.index(pair)
        cena[produkt_id].append(float(price))
        czas.append(t)


    plt.ion()
    ani=animation.FuncAnimation(fig,animate,interval=1000)#, blit=True)repeat=True)
    plt.show()
    plt.pause(0.001)
    #fig.clf()
    beta.append(time.time()-alpfa)
    print(beta[-1])

1 Ответ

0 голосов
/ 01 ноября 2018

Проблема с вашим кодом в том, что вы вызываете новую анимацию в цикле while. Следовательно, это приведет к замедлению линии. Лучше начать свой сюжет. Одна хитрость может заключаться в непосредственном обновлении данных объекта:

from matplotlib.pyplot import subplots, pause, show
from numpy import sin, pi

fig, ax = subplots()

x = [0]
y = [sin(2 * pi * x[-1])]
p1, = ax.plot(x, y) 

show(block = False)
while True:
    # update data
    x.append(x[-1] + .1)
    y.append(sin(2 * pi * x[-1]))
    p1.set_data(x, y) # update data
    ax.relim()        # rescale axis
    ax.autoscale_view()# update view
    pause(1e-3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...