matplotlib.animation: Une bibliothèque de génération d'animation pratique basée sur matplotlib.
Installation
@mac
$ pip install matplotlib
$ brew install imagemagick #Pour enregistrer le gif
$ brew install ffmpeg #Pour enregistrer mp4
matplotlib.réparation rc
$ python -c "import matplotlib;print(matplotlib.matplotlib_fname())"
/Users/riki/.pyenv/versions/ML-2.7.13/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
$ atom /Users/riki/.pyenv/versions/ML-2.7.13/lib/python2.7/site-packages/matplotlib/mpl-data/matplotlibrc
# line 38
- backend : macosx
+ backend : Tkagg
Il existe deux types de fonctions qui génèrent une animation
Personnellement, l'animation d'artiste est plus facile à comprendre, donc je le recommande. FuncAnimation est plus flexible, mais je ne ressens aucun inconvénient avec Artist Animation.
ArtistAnimation
animation.ArtistAnimation(fig, artists, interval=200)
Notez qu'il est facile d'obtenir une erreur où l'argument artist doit être une liste de liste. (Les détails seront décrits plus tard)
anim_sin_wave.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
x = np.arange(0, 10, 0.1)
ims = []
for a in range(50):
y = np.sin(x - a)
line, = plt.plot(x, y, "r")
ims.append([line])
ani = animation.ArtistAnimation(fig, ims)
ani.save('anim.gif', writer="imagemagick")
ani.save('anim.mp4', writer="ffmpeg")
plt.show()
La fonction pyplot.plot peut tracer plusieurs graphiques à la fois, le type de retour est donc list.
lines = plt.plot(x1, y1, 'r', x2, y2, 'g', x3, y3, 'b')
print type(lines) # list
print len(lines) # 3
print type(lines[0]) # matplotlib.lines.Line2D
Pour plus de clarté, le code principal ose décompresser pour récupérer l'objet Line2D, puis le changer en liste puis l'ajouter à la liste.
line, = plt.plot(x, y, "r")
ims.append([line])
Vous pouvez enregistrer l'animation comme suit (toute personne qui aime gif ou mp4)
ani.save('anim.gif', writer="imagemagick")
ani.save('anim.mp4', writer="ffmpeg")
dynamic_image.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
def f(x, y):
return np.sin(x) + np.cos(y)
x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
ims = []
for i in range(60):
x += np.pi / 15.
y += np.pi / 20.
im = plt.imshow(f(x, y), animated=True)
ims.append([im])
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
repeat_delay=1000)
ani.save('anim.gif', writer="imagemagick")
ani.save('anim.mp4', writer="ffmpeg")
plt.show()
Étant donné que le type de retour de la fonction pyplot.imshow est un objet AxesImage, créez-en une liste, puis ajoutez-le à la liste.
im = plt.imshow([[]])
print type(im) # matplotlib.image.AxesImage
ims.append([im])
Recommended Posts