Matplotlib creates an animated chart in real time

I find it difficult to configure my code to create an animated graph in real time, my code is graphically after collecting data, not showing each iteration. My script launches a regression function, then saves to a file, then I access the files and draw them, is that what I have, what do I need to move or change, so that it displays a graph in real time? I tried moving the chart 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: iteration count and Ck value or error, so they look like

 1,.0554 2,.0422 3,.0553 4,.0742 5,.0232 
+6
source share
1 answer

Solution for pre-calculated 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() 

Real-time animation solution for calculating values

Here is the version that allows real-time animation of data using 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 RegrMagic class is the mocks Regr_magic() . The __call__ method makes an instance of this class as a function. It has a state and produces numbers 1, 0.56565 , 2, 0.65566 , etc. For each call (the second number is a random number). It also has a time delay to simulate the calculation time.

Important frames() . Replace Regr_magic() with Regr_magic() and it should be good to go.

Solution for a specific task

Version without layouts:

 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() 
+8
source

All Articles