gpt4 book ai didi

python-2.7 - Python 中的动画条形图

转载 作者:行者123 更新时间:2023-12-03 23:55:18 25 4
gpt4 key购买 nike

我想在 Python 中制作一个动画条形图并将此动画保存为 mp4 格式。我的问题是保存的视频叠加中的帧,尽管我使用“blit=True”来告诉动画只绘制逐帧变化的东西。令人惊讶的是,这个问题并没有出现在 Python 的内置预览中。
这是反射(reflect)我情况的最低限度:

import matplotlib.pyplot as plt
from matplotlib import animation

def barlist(n): #That's the list of bars I want to display
C=[]
for k in range(1,6):
C.append(1/float(n*k))
return C

fig=plt.figure()

n=100 #Number of frames

def animate(i):
x=range(1,6)
y=barlist(i+1)
return plt.bar(x,y)

anim=animation.FuncAnimation(fig,animate,repeat=False,blit=True,frames=n,
interval=50)
anim.save('barchart_animated_'+str(n)+'.mp4')
plt.show()

我必须承认,我不太确定我应该怎么做才能消除这个缺陷。我所知道的关于条形图没有在框架中重叠的唯一示例是在这里(更准确地说,我指的是以下链接的第一个答案的代码):

Dynamically updating a bar plot in matplotlib

似乎我必须以某种方式告诉动画它应该如何使用 set_height 方法在每一帧设置每个条的高度。但正如我所说,我真的不知道上面的例子有什么问题。谢谢你的帮助!

马丁

最佳答案

您在这里遇到的问题是您在动画的每次交互中都创建了一个新的条形图。它们将被一个一个地添加到图中,但由于它们的高度随着时间的推移而缩小,看起来好像只存在第一个条。

有两种方法可以克服这一点。第一个选项是在绘制新条形图之前清除轴。然而,这将重新调整轴限制,然后应不断将其设置为相同的值。

另一种选择是操纵轴中唯一的条形图,并为每一帧调整它的高度。这显示在下面的代码中。

import matplotlib.pyplot as plt
from matplotlib import animation

def barlist(n):
return [1/float(n*k) for k in range(1,6)]

fig=plt.figure()

n=100 #Number of frames
x=range(1,6)
barcollection = plt.bar(x,barlist(1))

def animate(i):
y=barlist(i+1)
for i, b in enumerate(barcollection):
b.set_height(y[i])

anim=animation.FuncAnimation(fig,animate,repeat=False,blit=False,frames=n,
interval=100)

anim.save('mymovie.mp4',writer=animation.FFMpegWriter(fps=10))
plt.show()

对评论中问题的回答:

Blitting 是一种技术,其中图形的所有未更改部分都存储为背景。然后对于每个动画帧,只重绘变化的部分。这避免了从头开始重新绘制背景,从而允许更快的动画。 Blitting 只会影响屏幕上的动画,因为将动画保存到文件不是实时执行的(无论如何也不需要)。
使用 blit=False这里允许使代码更简单,因为我们不需要关心屏幕上的动画和保存的动画之间的区别——它们是一样的。
enumerate函数从枚举序列中产生索引和对象。我确实在这里使用了它,因为这是在同一个循环中获取两者的便捷方式。这里一点都不重要,你也可以做类似的事情
for i in range(len(barcollection)):
barcollection[i].set_height(y[i])

关于python-2.7 - Python 中的动画条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com