matplotlib.pyplot.FuncAnimation.save () непреднамеренно обрезает анимацию. Как мне избежать этого? - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу сохранить анимацию, сделанную с помощью plt.FuncAnimation(). Он имеет длинный заголовок и текстовые поля (с различными параметрами) сбоку. Я пробовал писать ffpmeg (.mp4), pillow (.gif) и imagemagick (.gif). Все попытки приводят к тому, что выходной файл, по-видимому, увеличивает основной рисунок, обрезая текст и снижая качество. Как мне избежать этого?

Та же проблема возникла с сохранением цифр через plt.savefig(), но это исправлено либо через plt.tight_layout(), либо plt.savefig(bbox_inches='tight'). Ни один из них не работает с plt.FuncAnimation().save().

Вот пример:

"""
Matplotlib Animation Example

author: Jake Vanderplas
email: vanderplas@astro.washington.edu
website: http://jakevdp.github.com
license: BSD
Please feel free to use and modify this, but keep the above information. Thanks!
"""

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

# First set up the figure, the axis, and the plot element we want to animate
fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)

ax.set_title('This is a really long title that is cropped in the .mp4, but not the .ipynb output.')

ax.text(3, 0.5, 'Text outside the graph is also cropped in the .mp4, but not the .ipynb output.')

# initialization function: plot the background of each frame
def init():
    line.set_data([], [])
    return line,

# animation function.  This is called sequentially
def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
    return line,

# call the animator.  blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=200, interval=20, blit=True)

# save the animation as an mp4.  This requires ffmpeg or mencoder to be
# installed.  The extra_args ensure that the x264 codec is used, so that
# the video can be embedded in html5.  You may need to adjust this for
# your system: for more information, see
# http://matplotlib.sourceforge.net/api/animation_api.html
anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])

plt.show()

1 Ответ

0 голосов
/ 20 февраля 2020

Мне удалось решить эту проблему с помощью пустых участков. См. здесь , чтобы узнать, как полностью скрыть подзаговор. Затем вы можете добавить фигуры / текст в этот участок по желанию.

...