Matplotlib create real time animated graph
Solution for pre-computed results
This makes a decent animation from the data in your output file:
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()
Solution for a real-time animation as the values are computed
Here a version that allows real-time animation of data produce by 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()
The class RegrMagic
is a helper the mocks Regr_magic()
. The __call__
method makes an instance of this class behave like a function. It has state and produces the numbers 1, 0.56565
, 2, 0.65566
etc. for each call (second number is a random number). It also has a time delay to mimic the computation time.
The important thing is frames()
. Replace Regr_magic()
with Regr_magic()
and should be good to go.
Solution for the concrete problem
A version without mocks:
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()
octain
Updated on July 18, 2022Comments
-
octain almost 2 years
I am having a hard time setting up my code to create a real time animated graph, my code is graphing after the data is being collected, not showing every iteration. My script runs a regression function then stores in a file, then I access the files and plot them, here is what I have, what do I need to move around or change to have it graph real time? I tried moving the plot functions inside the
for
loop but that didn't work, any suggestions?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()
FYI, data files contain the following, the iteration number and Ck value or error, so they look like this
1,.0554 2,.0422 3,.0553 4,.0742 5,.0232
-
octain over 8 yearsthank you! now i see what I am missing, will this working on the fly as the data file is being appended by new data?
-
Mike Müller over 8 yearsThat would need some changes.
frames
would need to be a generator that yields on value after the other. -
octain over 8 yearsI am not sure how to do that, I am not familiar with yields in python. But would I need to return x as a yield?
-
octain over 8 yearsAlso, does it matter that you used Class? because my regression function
c,e=Regr_magic()
is a function that returns two different variables -
Mike Müller over 8 yearsThe class is just a helper to make it work. You can throw it out and use your function:
yield Regr_magic()
. Note the capitalR
. -
Mr. Jibz over 5 years@MikeMüller do you know how to do this with opencv for real time emotion detection with web cam?
-
Mike Müller over 5 yearsSorry, I don't use opencv.
-
user3486308 almost 5 yearsMay you help me on this: stackoverflow.com/questions/56087708/…