如何在Matplotlib动画中结合多曲线更新与实时文本更新?
解决Matplotlib动画中实时更新文本的问题
要让文本对象随动画实时更新,你需要将文本对象加入到animate函数返回的艺术家可迭代对象中,且必须保持返回值是一个扁平的可迭代结构(比如单一列表)。
你的问题出在返回语句的结构上:return (plt_tracks + plt_lastPos), plt_text 会返回一个包含两个元素的元组(列表+文本),而FuncAnimation需要的是所有更新的艺术家组成的单一扁平列表。
修正后的代码
只需修改animate函数的返回语句,将文本对象以列表形式追加到现有艺术家列表末尾:
import matplotlib.animation as anim import matplotlib.pyplot as plt import numpy as np tracks = {} xdata = {} ydata = {} n_tracks = 2 n_waypts = 100 for ii in range(n_tracks): # generate fake data lat_pts = np.linspace(10+ii*1,20+ii*1,n_waypts) lon_pts = np.linspace(10+ii*.5,20+ii*.5,n_waypts) tracks[str(ii)] = np.array( [lat_pts, lon_pts] ) xdata[str(ii)] = [] ydata[str(ii)] = [] fig = plt.figure() ax1 = fig.add_subplot( 1,1,1, aspect='equal', xlim=(0,30), ylim=(0,30) ) plt_tracks = [ax1.plot([], [], marker=',', linewidth=1)[0] for _ in range(n_tracks)] plt_lastPos = [ax1.plot([], [], marker='o', linestyle='none')[0] for _ in range(n_tracks)] plt_text = ax1.text(25, 25, '') def animate(i): # x and y values to be plotted for jj in range(n_tracks): xdata[str(jj)].append( tracks[str(jj)][1,i] ) ydata[str(jj)].append( tracks[str(jj)][0,i] ) # update x and y data for jj in range(n_tracks): plt_tracks[jj].set_data( xdata[str(jj)], ydata[str(jj)] ) plt_lastPos[jj].set_data( xdata[str(jj)][-1], ydata[str(jj)][-1] ) plt_text.set_text('{0}'.format(i)) # 将文本对象加入返回列表 return plt_tracks + plt_lastPos + [plt_text] anim = anim.FuncAnimation( fig, animate, frames=n_waypts, interval=20, blit=True, repeat=False ) plt.show()
关键说明
- 扁平可迭代结构:
plt_tracks和plt_lastPos都是列表,相加后得到所有曲线和标记的艺术家列表,再追加[plt_text](将单个文本对象转为列表元素),最终返回一个包含所有需更新元素的扁平列表。 - Blitting机制:当
blit=True时,Matplotlib只会重绘返回列表中的艺术家对象,因此必须将所有动态更新的元素(包括文本)都纳入返回列表,否则文本不会实时刷新。
内容的提问来源于stack exchange,提问作者Alf
相关产品推荐
相关产品推荐

