我一直在研究如何为飞行路径设置多条线的动画.我读取多个GPS文件的对象时间同步它们,它们为每个路径设置相对于时间的动画.我找到了如何使用动画函数中的append为一行设置动画.现在我需要为导入的文件添加第二个和第三个.
我知道问题出在我如何使用行执行set_data.我见过多个例子,但我不明白设置多行所需的结构.是的我是新手.
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()
解决方法
line2d artist的Matplotlib文档解释了set_data的工作原理.它“ACCEPTS:2D数组(行是x,y)或两个1D数组.”它也适用于列表.你已经给它一个四元素列表了.您需要分别设置每行的x和y数据.我在下面列出了一个假数据的例子.
import matplotlib.pyplot as plt from matplotlib import animation from numpy import random fig = plt.figure() ax1 = plt.axes(xlim=(-108,lw=2) plt.xlabel('Longitude') plt.ylabel('Latitude') plotlays,[] # 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,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,interval=10,blit=True) plt.show()