Matplotlib multiple animate multiple lines
Andrew Henderson
I have been researching on how to animate multiple lines for a flight path. The object it that I read multiple GPS files time sync them them animate each path with respect to time. I found how to animate one line using append in the animate functions. Now I need to add a second and third for as many files are imported.
I know the problem is somewhere in how I perform the set_data with the lines. I ahve seen multiple example but I do not understand what structure is required to set up multiple lines. Yes I am a newbie.
fig = plt.figure()
ax1 = plt.axes(xlim=(-108, -104), ylim=(31,34))
line, = ax1.plot([], [], lw=2)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plotlays, plotcols = [2], ["black","red"]
lines = []
for index in range(2): lobj = ax1.plot([],[],lw=2,color=plotcols[index])[0] lines.append(lobj)
def init(): for line in lines: line.set_data([],[]) return lines
x1,y1 = [],[]
x2,y2 = [],[]
frame_num = len(gps_data[0])
# animation function. This is called sequentially
def animate(i): x = gps_data[0][i,3] y = gps_data[0][i,2] x1.append(x) y1.append(y) x = gps_data[1][i,3] y = gps_data[1][i,2] x2.append(x) y2.append(y) #X = np.array(x1, x2) #Y = np.array(y1, y2) #for index in range(0,1): for lnum,line in enumerate(lines): line.set_data([x1,y1, x2,y2]) return lines,
# call the animator. blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=frame_num, interval=1, blit=True)
plt.show() 0 1 Answer
The Matplotlib documentation for the line2d artist explains how set_data works. It "ACCEPTS: 2D array (rows are x, y) or two 1D arrays." It also works with lists. You've given it a four element list instead. You need to set the x and y data of each line separately. I've included an example with fake data below.
import matplotlib.pyplot as plt
from matplotlib import animation
from numpy import random
fig = plt.figure()
ax1 = plt.axes(xlim=(-108, -104), ylim=(31,34))
line, = ax1.plot([], [], lw=2)
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plotlays, plotcols = [2], ["black","red"]
lines = []
for index in range(2): lobj = ax1.plot([],[],lw=2,color=plotcols[index])[0] lines.append(lobj)
def init(): for line in lines: line.set_data([],[]) return lines
x1,y1 = [],[]
x2,y2 = [],[]
# fake data
frame_num = 100
gps_data = [-104 - (4 * random.rand(2, frame_num)), 31 + (3 * random.rand(2, frame_num))]
def animate(i): x = gps_data[0][0, i] y = gps_data[1][0, i] x1.append(x) y1.append(y) x = gps_data[0][1,i] y = gps_data[1][1,i] x2.append(x) y2.append(y) xlist = [x1, x2] ylist = [y1, y2] #for index in range(0,1): for lnum,line in enumerate(lines): line.set_data(xlist[lnum], ylist[lnum]) # set data for each line separately. return lines
# call the animator. blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=frame_num, interval=10, blit=True)
plt.show() 3