使用matplotlib动画将文本更新与正在更新的n条曲线结合起来

falq053o  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(102)

我用matplotlib的动画绘制了n条曲线,多亏了前面的问题和答案,这条曲线运行得很好,现在我想在绘图中添加一些不断更新的文本,基本上是帧数,但我不知道如何将该对象与我的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 

anim    = anim.FuncAnimation( fig, animate, frames=n_waypts, interval=20, blit=True, repeat=False )
plt.show()

简单地将return语句更改为return (plt_tracks + plt_lastPos), plt_textreturn (plt_tracks + plt_lastPos), plt_text,之类的语句是不起作用的,那么如何正确地组合这些艺术家呢?

7gcisfzg

7gcisfzg1#

animate函数必须返回 * articts * 的可迭代对象(例如,其中articts是作为plot-call的结果而绘制的对象)。plt_tracksplt_lastPost都是这样的可迭代对象。但是,plt_text是单个articts。因此,使代码正常工作的一个可能的解决方案是将return语句更改为

return plt_tracks + plt_lastPos + [plt_text]

或者,也可以这样写

return tuple(plt_tracks + plt_lastPos) + (plt_text,)

相关问题