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

问题描述 投票:0回答:3

我尝试使用 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()
python animation matplotlib
3个回答
12
投票

要为艺术家设置动画,您必须返回对

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)


7
投票

您需要将动画艺术家作为序列列表提供给

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()

0
投票

假设您画一条线并得到一个

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 建议的那样,使用

Text
FuncAnimation

© www.soinside.com 2019 - 2024. All rights reserved.