How to pass arguments to animation.FuncAnimation()?
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/.
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()