Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib create real time animated graph

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
like image 890
octain Avatar asked Dec 19 '15 23:12

octain


People also ask

Can matplotlib plot real-time graphs?

To create a real-time plot, we need to use the animation module in matplotlib. We set up the figure and axes in the usual way, but we draw directly to the axes, ax , when we want to create a new frame in the animation.

Can matplotlib plot live data?

The live plotting function is capable of producing high-speed, high-quality, real-time data visualization in Python using matplotlib and just a few lines of code. In my next post on this subject, I will introduce live visualization of words using the same method outlined above.

Can you animate matplotlib?

Animations in Matplotlib can be made by using the Animation class in two ways: By calling a function over and over: It uses a predefined function which when ran again and again creates an animation. By using fixed objects: Some animated artistic objects when combined with others yield an animation scene.


1 Answers

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()
like image 89
Mike Müller Avatar answered Sep 30 '22 13:09

Mike Müller