我想有一个迭代绘制的图形,允许跳到下一帧,停止它,并返回到前一帧。
我已经看过matplotlib动画模块,如果有一种方法来实现前一帧的功能(比如在按下一个键时向后运行动画几帧),它将是完美的
这样的东西会很好:
def update_frame(i, data):
fig.set_data(data[i])
但是我可以显式地管理i迭代器是增加还是减少。
在matplotlib中有办法做到这一点吗?我应该寻找一个不同的python模块吗?
我想有一个迭代绘制的图形,允许跳到下一帧,停止它,并返回到前一帧。
我已经看过matplotlib动画模块,如果有一种方法来实现前一帧的功能(比如在按下一个键时向后运行动画几帧),它将是完美的
这样的东西会很好:
def update_frame(i, data):
fig.set_data(data[i])
但是我可以显式地管理i迭代器是增加还是减少。
在matplotlib中有办法做到这一点吗?我应该寻找一个不同的python模块吗?
2条答案
按热度按时间kd3sttzy1#
FuncAnimation
类允许supply a generator function到frames
参数。该函数将被期望产生一个值,该值被提供给动画的每个步骤的更新函数。FuncAnimation
doc声明:frames
:iterable,int,generator function,or None,optional [..]如果是一个生成器函数,那么必须有签名
def gen_function() -> obj:
在所有这些情况下,帧中的值只是简单地传递给用户提供的func,因此可以是任何类型。
现在我们可以创建一个生成器函数,它可以向前或向后生成整数,这样动画就向前运行
或向后运行
。为了控制动画,我们可以使用
matplotlib.widgets.Button
s,并创建一个向前一步的或向后一步的
功能。这类似于my answer关于循环通过一组图像的问题。
下面是一个名为
Player
的类,它是FuncAnimation
的子类,并包含了所有这些,允许启动和停止动画。它可以类似于FuncAnimation
进行示例化。其中
update
是一个更新函数,期望输入一个整数,mini
和maxi
表示函数可以使用的最小和最大数字。该类存储当前索引的值(self.i
),这样,如果动画停止或恢复,它将在当前帧重新开始。注意:这并没有以允许blitting的方式编写。
acruukt92#
有关动画模块的正确工作答案,请参见the answer of ImportanceOfBeingErnest
我对您的预期功能有多个问题。动画的进度如何与反转一起工作?会不会有一个视频,但按下一个按钮就开始播放?还是应该有单独的框架步骤?我不确定我理解如何动画可以耦合到这个反转功能;我认为matplotlib动画本质上是电影。
我的另一个问题是技术性的:我不确定这可以用matplotlib动画来完成。文档解释说
FuncAnimation
表面上执行其中
frames
本质上是可迭代的。在动画中动态调整frames
对我来说并不简单,所以这是一个技术障碍。实际上,您所描述的功能在我的脑海中以基于小部件的方式运行得更好。按钮可以传播“动画”,或者您可以有一个检查按钮来修改下一步是前进还是后退。这里有一个简单的概念证明我的意思:
请注意,我对matplotlib小部件或GUI并不熟悉,所以不要期望上面的内容符合本主题的最佳实践。我还添加了一些额外的参数,在这里和那里传递,因为我不喜欢使用全局名称,但这在本文中可能有些迷信;我真的看不出来。另外,如果您在类或函数中定义这些对象,请确保保留对小部件的引用,否则当意外垃圾收集时,它们可能会变得无响应。
生成的图形具有用于绘制散点图的轴,并且有两个按钮用于递增切片索引。数据的形状为
(ndat,100,2)
,其中尾部索引定义了2d空间中的100个点。特定状态:(It不需要这么难看,我只是不想乱改设计。)
我甚至可以想象一个定时器自动更新绘图的设置,并且可以使用小部件设置更新的方向。我不知道如何才能正确地完成这一点,但我会努力追求这条道路,以获得你似乎所追求的那种可视化。
还要注意的是,上面的方法完全没有
FuncAnimation
可以做的blitting和其他优化,但希望这不会影响您的可视化。