Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass arguments to animation.FuncAnimation()?

How to pass arguments to animation.FuncAnimation()? I tried, but didn't work. The signature of animation.FuncAnimation() is

class matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, **kwargs) Bases: matplotlib.animation.TimedAnimation

I have pasted my code below. Which changes I have to make?

import matplotlib.pyplot as plt
import matplotlib.animation as animation

def animate(i,argu):
    print argu

    graph_data = open('example.txt','r').read()
    lines = graph_data.split('\n')
    xs = []
    ys = []
    for line in lines:
        if len(line) > 1:
            x, y = line.split(',')
            xs.append(x)
            ys.append(y)
        ax1.clear()
        ax1.plot(xs, ys)
        plt.grid()

ani = animation.FuncAnimation(fig,animate,fargs = 5,interval = 100)
plt.show()
like image 363
vinaykp Avatar asked May 09 '16 08:05

vinaykp


People also ask

What is Blit in FuncAnimation?

blit=True means only re-draw the parts that have changed. anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True) plt.show()

What is interval in FuncAnimation?

interval: It is an optional integer value that represents the delay between each frame in milliseconds. Its default is 100. repeat_delay: It is an optional integer value that adds a delay in milliseconds before repeating the animation. It defaults to None.

How do I stop Matplotlib FuncAnimation?

stop() . Alternatively you may stop the animation with anim. event_source. stop() .


2 Answers

Check this simple example:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt 
import matplotlib.animation as animation
import numpy as np

data = np.loadtxt("example.txt", delimiter=",")
x = data[:,0]
y = data[:,1]

fig = plt.figure()
ax = fig.add_subplot(111)
line, = ax.plot([],[], '-')
line2, = ax.plot([],[],'--')
ax.set_xlim(np.min(x), np.max(x))
ax.set_ylim(np.min(y), np.max(y))

def animate(i,factor):
    line.set_xdata(x[:i])
    line.set_ydata(y[:i])
    line2.set_xdata(x[:i])
    line2.set_ydata(factor*y[:i])
    return line,line2

K = 0.75 # any factor 
ani = animation.FuncAnimation(fig, animate, frames=len(x), fargs=(K,),
                              interval=100, blit=True)
plt.show()

First, for data handling is recommended to use NumPy, is simplest read and write data.

Isn't necessary that you use the "plot" function in each animation step, instead use the set_xdata and set_ydata methods for update data.

Also reviews examples of the Matplotlib documentation: http://matplotlib.org/1.4.1/examples/animation/.

like image 125
Pedro Jorge De Los Santos Avatar answered Oct 11 '22 08:10

Pedro Jorge De Los Santos


Intro

Below you will find an example of code how to pass an argument properly to the animation.funcAnimation function.

If you save all the code parts below as a single .py file you can call the script as follow in your terminal: $python3 scriptLiveUpdateGraph.py -d data.csv where data.csv is your data file containing data you want to display live.

The usual modules import

Below is my script starting:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import argparse
import time
import os

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

Some function

Here I declare the function that will be called later by the animation.funcAnimation function.

def animate(i, pathToMeas):
    pullData = open(pathToMeas,'r').read()
    dataArray = pullData.split('\n')
    xar = []
    yar = []
    colunmNames = dataArray[0].split(',')
    # my data file had this structure:
    #col1, col2
    #100, 500
    #95, 488
    #90, 456
    #...
    # and this data file can be updated when the script is running
    for eachLine in dataArray[1:]:
        if len(eachLine) > 1:
           x, y = eachLine.split(',')
           xar.append(float(x))
           yar.append(float(y))

   # convert list to array
   xar = np.asarray(xar)
   yar = np.asarray(yar)

   # sort the data on the x, I do that for the problem I was trying to solve.
   index_sort_ = np.argsort(xar)
   xar = xar[index_sort_]
   yar = yar[index_sort_]

   ax1.clear()
   ax1.plot(xar, yar,'-+')
   ax1.set_xlim(0,np.max(xar))
   ax1.set_ylim(0,np.max(yar))

Process the input parameters

To make the script more interactive I have added the possibility to read input file with argparse:

parser = argparse.ArgumentParser()
parser.add_argument("-d","--data",
                help="data path to the data to be displayed.",
                type=str)

args = parser.parse_args()

Call the function to do the animation

And know we are answering the main question of this thread:

ani = animation.FuncAnimation(fig, animate, fargs=(args.data,), interval=1000 )
plt.show()
like image 24
Jeremie Gerhardt Avatar answered Oct 11 '22 09:10

Jeremie Gerhardt