matplotlib艺术家动画:标题或文本不变

9gm1akwq  于 2023-05-18  发布在  其他
关注(0)|答案(3)|浏览(94)

我尝试使用matplotlib的ArtistAnimation。图的文本和标题应该在每一帧中改变,但它们没有。我读过很多类似问题的帖子,但我仍然不明白什么是解决方案。演示没有显示更新标题,因为我可以找到。
如果有人知道,我会很感激的!

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

fig =plt.figure()    
ims=[]

for iternum in range(4):
    plt.title(iternum)
    plt.text(iternum,iternum,iternum)
    ims.append([plt.scatter(np.random.randint(0,10,5), np.random.randint(0,20,5),marker='+'    )])
    #plt.cla()

ani = animation.ArtistAnimation(fig, ims, interval=500, blit=False,
                              repeat_delay=2000)
plt.show()
mepcadol

mepcadol1#

要为艺术家制作动画,必须返回ims[]数组中每个艺术家的引用,包括Text对象。

但它不适用于标题,我不知道为什么。也许有人对其中的机制有更好的理解,将能够启发我们。

尽管如此,标题只是一个Text对象,所以我们可以使用以下命令来产生所需的效果:

fig = plt.figure()
ax = fig.add_subplot(111)
ims=[]

for iternum in range(4):
    ttl = plt.text(0.5, 1.01, iternum, horizontalalignment='center', verticalalignment='bottom', transform=ax.transAxes)
    txt = plt.text(iternum,iternum,iternum)
    ims.append([plt.scatter(np.random.randint(0,10,5), np.random.randint(0,20,5),marker='+'    ), ttl, txt])
    #plt.cla()

ani = animation.ArtistAnimation(fig, ims, interval=500, blit=False,
                              repeat_delay=2000)

3pvhb19x

3pvhb19x2#

您需要为艺术家提供动画,作为序列列表到ArtistAnimation。在问题的代码中,您只提供散点,而不提供文本和标题。
不幸的是,标题也是轴的一部分,因此不会改变,即使提供。因此,您可以使用普通文本代替。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

fig, ax = plt.subplots()
ims=[]

for iternum in range(4):
    title = plt.text(0.5,1.01,iternum, ha="center",va="bottom",color=np.random.rand(3),
                     transform=ax.transAxes, fontsize="large")
    text = ax.text(iternum,iternum,iternum)
    scatter = ax.scatter(np.random.randint(0,10,5), np.random.randint(0,20,5),marker='+')
    ims.append([text,scatter,title,])

ani = animation.ArtistAnimation(fig, ims, interval=500, blit=False,
                              repeat_delay=2000)
plt.show()

您可以考虑使用FuncAnimation而不是ArtistAnimation。这样可以很容易地更改标题。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation

fig, ax = plt.subplots()
ims=[]

text = ax.text(0,0,0)
scatter = ax.scatter(np.random.randint(0,10,5), np.random.randint(0,20,5),marker='+')

def update(iternum):
    plt.title(iternum)
    text.set_position((iternum, iternum))
    text.set_text(str(iternum))
    scatter.set_offsets(np.random.randint(0,10,(5,2)))

ani = animation.FuncAnimation(fig, update, frames=4, interval=500, blit=False,
                              repeat_delay=2000)
plt.show()
tktrz96b

tktrz96b3#

假设你画一条线,得到一个Line2D对象。然后使用Line2D.set_data更新该行。当对象是同一个时,数据(以及线的位置)会发生变化,因此当您执行ArtistAnimation时,不同的帧将显示同一个对象,其中包含更新的信息。
现在来看看标题。文件上说
设置三个可用轴标题之一。可用字幕位于轴上方的中心,与左边缘齐平,与右边缘齐平。
源代码是

titles = {'left': self._left_title,
          'center': self.title,
          'right': self._right_title}
title = _api.check_getitem(titles, loc=loc.lower())

这是同样的情况。Title对象是预先构造的,只更新其内容(而不是对象)。当您执行ArtistAnimation时,只有最后一次更新有效。
为了避免这种情况,正如@Diziet Asahi和@ImportanceOfBeingErnest所建议的,使用TextFuncAnimation

相关问题