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()