matplotlib.animation: Eine praktische Bibliothek zur Generierung von Animationen, die auf matplotlib basiert.
Installation
@mac
$ pip install matplotlib
$ brew install imagemagick #Zum Speichern von GIF
$ brew install ffmpeg #Zum Speichern von mp4
matplotlib.rc fix
$ 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
Es gibt zwei Arten von Funktionen, die Animationen erzeugen
Persönlich ist Artist Animation leichter zu verstehen, daher empfehle ich dies. FuncAnimation ist flexibler, aber ich habe keine Unannehmlichkeiten mit Artist Animation.
ArtistAnimation
animation.ArtistAnimation(fig, artists, interval=200)
Beachten Sie, dass es leicht zu Fehlern kommt, wenn das Argument des Künstlers eine Liste von Listen sein muss. (Details werden später beschrieben)
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()
Die Funktion pyplot.plot kann mehrere Diagramme gleichzeitig zeichnen, sodass der Rückgabetyp eine Liste ist.
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
Aus Gründen der Übersichtlichkeit wagt der Hauptcode das Entpacken, um das Line2D-Objekt abzurufen, es dann in Liste zu ändern und es dann zur Liste hinzuzufügen.
line, = plt.plot(x, y, "r")
ims.append([line])
Sie können die Animation wie folgt speichern (jeder, der GIF oder MP4 mag)
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()
Da der Rückgabetyp der Funktion pyplot.imshow ein AxesImage-Objekt ist, erstellen Sie eine Liste und fügen Sie sie der Liste hinzu.
im = plt.imshow([[]])
print type(im) # matplotlib.image.AxesImage
ims.append([im])
Recommended Posts