Matplotlib create real time animated graph

11,125

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()
Share:
11,125
octain
Author by

octain

Updated on July 18, 2022

Comments

  • octain
    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
    octain over 8 years
    thank 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
    Mike Müller over 8 years
    That would need some changes. frames would need to be a generator that yields on value after the other.
  • octain
    octain over 8 years
    I 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
    octain over 8 years
    Also, 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
    Mike Müller over 8 years
    The class is just a helper to make it work. You can throw it out and use your function: yield Regr_magic(). Note the capital R.
  • Mr. Jibz
    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
    Mike Müller over 5 years
    Sorry, I don't use opencv.
  • user3486308
    user3486308 almost 5 years
    May you help me on this: stackoverflow.com/questions/56087708/…