保存matplotlib动画时出错,缺少'dpi'参数

时间:2019-05-16 19:01:15

标签: python-3.x matplotlib ffmpeg

我正在尝试保存matplotlib.animation.AnimationFunc的动画,但出现错误,提示缺少'dpi'参数。显然,我已经设置了dpi,所以我不知道此错误来自何处。

我正在运行python 3.6和matplotlib 3.0.3,我也刚刚从ubuntu官方存储库(Ubuntu 18.04)安装了ffmpeg。

这是我的代码中应该影响的部分,尽管我认为这应该是系统的一部分:

Writer = writers['ffmpeg']
writer = Writer(fps=15, metadata=dict(artist='Me'), bitrate=1800,)
ani = FuncAnimation(fig, anime, interval=time_step *
                    10**3, frames=F, repeat=False,) 
ani.save('standard_map.mp4', writer=Writer, dpi=100)

错误是:

with writer.saving(self._fig, filename, dpi):
File "/usr/lib/python3.6/contextlib.py", line 159, in helper
    return _GeneratorContextManager(func, args, kwds)
File "/usr/lib/python3.6/contextlib.py", line 60, in __init__
    self.gen = func(*args, **kwds) TypeError: saving() missing 1 required positional argument: 'dpi'

我都尝试添加他们在此处建议的行,并且错误仍然相同。

plt.rcParams['animation.ffmpeg_path'] = '/usr/bin/ffmpeg'

我还尝试将编写器更改为默认情况下在Ubuntu上设置的'imagemagick',并且错误仍然存​​在。

4 个答案:

答案 0 :(得分:1)

没有将dpi参数传递给ani.save(),请提供它:

ani.save('standard_map.mp4', writer=Writer, dpi=100)

答案 1 :(得分:0)

这对我有用:

writer = animation.FFMpegFileWriter(fps=15, metadata=dict(artist='Me'), bitrate=1800)

对于MACOS,您需要blit=False

答案 2 :(得分:0)

我尝试使用matplotlib文档中的示例重现该问题:

kafka-console-consumer.sh --bootstrap-server INTERNAL://0.0.0.0:9093 --topic greetings --from-beginning
{"name":"Alice","message":"Namastey"}

这确实会给您上述例外:

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

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro')

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

writers = animation.writers
writer = writers['ffmpeg']
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)
ani.save("test.mp4",writer=writer)

有一个简单的解决方案:您需要writer的实例,而不是writer类本身。因此,替换

TypeError: saving() missing 1 required positional argument: 'dpi'

writer = writers['ffmpeg']

答案 3 :(得分:0)

从此guide

要写入文件,应将 Agg 后端用于matplotlib。

将以下内容放在代码顶部。

matplotlib.use("Agg")