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()
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()
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.
stop() . Alternatively you may stop the animation with anim. event_source. stop() .
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/.
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.
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)
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))
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()
And know we are answering the main question of this thread:
ani = animation.FuncAnimation(fig, animate, fargs=(args.data,), interval=1000 )
plt.show()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With