Matplotlib создать анимированный график в реальном времени

мне трудно настроить свой код для создания анимированного графика в реальном времени, мой код отображается после сбора данных, а не показывает каждую итерацию. Мой скрипт запускает функцию регрессии, затем сохраняет в файле, затем я получаю доступ к файлам и строю их, вот что у меня есть, что мне нужно переместить или изменить, чтобы он отображался в режиме реального времени? Я попытался переместить функции сюжета внутри for петли, но это не сработало, какие-либо предложения?

 fig = plt.figure()
 ax1 = fig.add_subplot(1,1,1)

 num = 10 
 for idx in range(1,num):
    c,e = Regr_magic()
        with open("CK_output.txt",'a') as CK:
            CK.write("{0},{1}n".format(idx,c))
        with open("error_output.txt",'a') as E:
            E.write("{0},{1}n".format(idx,e))



    def animate(i):
        pull = open('error_output.txt','r').read()
        data = pull.split('n')
        xar = []
        yar = []

        for each in data:
            if len(each)>1:
                x,y = each.split(',')
                xar.append(float(x))
                yar.append(float(y))
            ax1.plot(xar, yar)
    ani = animation.FuncAnimation(fig, animate, interval=1000)
    plt.show()

к вашему сведению, файлы данных содержат следующее, номер итерации и значение Ck или ошибку, поэтому они выглядят следующим образом

1,.0554
2,.0422
3,.0553
4,.0742
5,.0232

1 ответов


решения для предварительно вычисленных результатов

это делает приличную анимацию из данных в вашем выходном файле:

from matplotlib import pyplot as plt
from matplotlib import animation


fig = plt.figure()

with open('error_output.txt') as fobj:
    x, y = zip(*([float(x) for x in line.split(',')] for line in fobj))


def animate(n):
    line, = plt.plot(x[:n], y[:n], color='g')
    return line,

anim = animation.FuncAnimation(fig, animate, frames=len(x), interval=1000)
plt.show()

решение для анимации в реальном времени, как вычисляются значения

вот версия, которая позволяет в режиме реального времени анимации данных продуктов regr_magic:

import random
import time

from matplotlib import pyplot as plt
from matplotlib import animation


class RegrMagic(object):
    """Mock for function Regr_magic()
    """
    def __init__(self):
        self.x = 0
    def __call__(self):
        time.sleep(random.random())
        self.x += 1
        return self.x, random.random()

regr_magic = RegrMagic()

def frames():
    while True:
        yield regr_magic()

fig = plt.figure()

x = []
y = []
def animate(args):
    x.append(args[0])
    y.append(args[1])
    return plt.plot(x, y, color='g')


anim = animation.FuncAnimation(fig, animate, frames=frames, interval=1000)
plt.show()

класс RegrMagic является помощником The mocks Regr_magic(). The __call__метод заставляет экземпляр этого класса вести себя как функция. Оно имеет государство и производит цифры 1, 0.56565, 2, 0.65566 etc. для каждого вызова (второй номер-случайное число). Он также имеет временную задержку, чтобы имитировать время вычисления.

главное frames(). Заменить Regr_magic() С Regr_magic() и должно быть хорошо идти.

решение конкретной задачи

версия без насмешек:

import random
import time

from matplotlib import pyplot as plt
from matplotlib import animation


def frames():
    while True:
        yield Regr_magic()


fig = plt.figure()

x = []
y = []
def animate(args):
    x.append(args[0])
    y.append(args[1])
    return plt.plot(x, y, color='g')


anim = animation.FuncAnimation(fig, animate, frames=frames, interval=1000)
plt.show()