Python 保存 Matplotlib 动画

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18016390/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 09:43:54  来源:igfitidea点击:

Save Matplotlib Animation

pythonanimationmatplotlib

提问by throwaway17434

I am trying to make an Animation of a wave package and save it as a movie. Everything except the saving is working. Can you please tell me what I am doing wrong? When going into the line ani.save('MovWave.mp4')he tells me:

我正在尝试制作 wave 包的动画并将其另存为电影。除了保存之外的一切都在工作。你能告诉我我做错了什么吗?排队时,ani.save('MovWave.mp4')他告诉我:

    writer = writers.list()[0]
IndexError: list index out of range

I tried googling it of course, but I don't even know what it means.

我当然尝试过谷歌搜索,但我什至不知道它是什么意思。

UPDATE:I can call ffmpegin console now. It says I have ffmpeg version 0.10.7-6:0.10.7-0jon1~preciseinstalled. I updated the code and ran the program, but now I get the following error:

更新:ffmpeg现在可以在控制台中调用。它说我安装了 ffmpeg 版本0.10.7-6:0.10.7-0jon1~precise。我更新了代码并运行了程序,但现在出现以下错误:

Traceback (most recent call last):
  ani.save('MovWave.mpeg', writer="ffmpeg")
  writer.grab_frame()
  dpi=self.dpi)
  self.canvas.print_figure(*args, **kwargs)
  self.figure.dpi = origDPI
  self.dpi_scale_trans.clear().scale(dpi, dpi)
  self._mtx = np.identity(3)
  from numpy import eye
  File "<frozen importlib._bootstrap>", line 1609, in _handle_fromlist
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Update 2:Apparently there is a bug when using python 3.3 as doctorlove pointed out. I am now trying to use python 2.7 instead. Now it creates an mpeg-file but it cannot be played and it is only about ~150 kB big.

更新 2:显然在使用 python 3.3 时存在一个错误,正如doctorlove 指出的那样。我现在尝试改用 python 2.7。现在它创建了一个 mpeg 文件,但无法播放,它只有大约 150 kB 大。

Update 3:Okay, so I tried the exact same code on my Win7 machine and it also works in python 3.3. But I have the same problem, I had earlier with python 2.7. The mpeg-file created cannot be played and is only a few hundred kB.

更新 3:好的,所以我在我的 Win7 机器上尝试了完全相同的代码,它也适用于 python 3.3。但是我有同样的问题,我之前在 python 2.7 上遇到过。创建的mpeg文件无法播放,只有几百kB。

#! coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
time.clock()

def FFT(x,y):
    X = (x[-1]-x[0])/len(y)
    f = np.linspace(-2*np.pi/X/2,2*np.pi/X/2,len(y))
    F = np.fft.fftshift(np.fft.fft(y))/np.sqrt(len(y))
    return(f,F)

def FUNCTION(k_0,dx,c,t):
    y = np.exp(1j*k_0*(x-c*t))*np.exp(-((x-c*t)/(2*dx))**2 )*(2/np.pi/dx**2)**(1/4)
    k,F = FFT((x-c*t),y)
    return(x,y,k,F)

#Parameter
N = 1000
x   = np.linspace(0,30,N)
k_0 = 5
dx  = 1
c   = 1

l = [k_0,c,dx]

fig = plt.figure("Moving Wavepackage and it's FFT")
sub1 = plt.subplot(211)
sub2 = plt.subplot(212)
sub2.set_xlim([-10,10])
sub1.set_title("Moving Wavepackage and it's FFT")
sub1.set_ylabel("$Re[\psi(x,t)]$")
sub1.set_xlabel("$t$")
sub2.set_ylabel("$Re[\psi(k_x,t)]$")
sub2.set_xlabel("$k_x$")


n = 50
t = np.linspace(0,30,n)
img = []
for i in range(n):
    x,y,k,F = FUNCTION(k_0,dx,c,t[i]) 

    img.append(plt.plot(x,np.real(y),color="red", axes=plt.subplot(211)))
    img.append(plt.plot(k,np.real(F),color="red", axes=plt.subplot(212)))

ani = animation.ArtistAnimation(fig, img, interval=20, blit=True, repeat_delay=0)

ani.save('MovWave.mpeg', writer="ffmpeg")

print(time.clock())
plt.show()

回答by doctorlove

You mentioned mencoderin your text, but not the code.

mencoder在文本中提到了,但没有在代码中提到。

Matplotlib docs has a check for mencoderin a demo:

Matplotlib 文档mencoder演示中进行了检查:

not_found_msg = """
The mencoder command was not found;
mencoder is used by this script to make an avi file from a set of pngs.
It is typically not installed by default on linux distros because of
legal restrictions, but it is widely available.
"""

try:
    subprocess.check_call(['mencoder'])
except subprocess.CalledProcessError:
    print "mencoder command was found"
    pass # mencoder is found, but returns non-zero exit as expected
    # This is a quick and dirty check; it leaves some spurious output
    # for the user to puzzle over.
except OSError:
    print not_found_msg
    sys.exit("quitting\n")