In dem am Donnerstag vorgestellten, kostenlos herunterladbaren Buch zur Matplotlib waren auch einige Beispiele, wie man damit animierte Plots programmiert. Das mußte ich natürlich ausprobieren, und so habe ich einen kleinen, roten Punkt eine Sinuskurve abfahren lassen.
Dafür mußte ich lediglich eine zusätzliche Bibliothek importieren:
from matplotlib.animation import FuncAnimation, PillowWriter
pillowWriter
wird benötigt, um die Animation als GIF-Datei zu exportieren, doch dazu weiter unten mehr.
Die Animation selber wird als Funktion definiert:
redDot, = plt.plot([0], [np.sin(0)], "ro") def animate(i): redDot.set_data(i, np.sin(i)) return redDot,
Das Komma hinter redDot
sagt Python, daß es sich um ein Tuple mit nur einem Wert handelt. Das ist notwendig, weil ein Tuple die Methode set_data()
kennt, ein Skalar aber nicht.
Die Animation kann man nun mit dieser Zeile Code aufrufen:
anim = FuncAnimation(fig, animate, frames = np.arange(0.0, TWOPI, 0.05), interval = 10, blit = True, repeat = True)
Dann kommt folgende Animation heraus:
Dieses animierte GIF habe ich mit der im Screenshot auskommentierten Zeile
anim.save("sin.gif", writer = PillowWriter(fps = 30))
erzeugt. Leider kann der PillowWriter keine Loops in GIFs erzeugen1, das mußte ich dem GIF dann nachträglich in einem Graphikprogramm meines Vertrauens beibringen.
Für die, die alles vollständig haben wollen, um das Beispiel nachzuprogrammieren, zum Schluß das gesamte Skript:
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation, PillowWriter TWOPI = 2*np.pi fig, ax = plt.subplots() t = np.arange(0.0, TWOPI, 0.001) s = np.sin(t) l = plt.plot(t, s) ax = plt.axis([0, TWOPI, -1, 1]) redDot, = plt.plot([0], [np.sin(0)], "ro") def animate(i): redDot.set_data(i, np.sin(i)) return redDot, anim = FuncAnimation(fig, animate, frames = np.arange(0.0, TWOPI, 0.05), interval = 10, blit = True, repeat = True) # anim.save("sin.gif", writer = PillowWriter(fps = 30)) plt.show()
Das Python-Script ist wieder von erfrischender Kürze. Und die Zeile mit anim.save()
solltet Ihr – nachdem Ihr die Animation zu Eurer Zufriedenheit erzeugt habt – ebenfalls auskommentieren, sonst wird bei jedem Lauf ein neues GIF erzeugt und das alte überschrieben.
Jetzt habe ich jedenfalls Lust bekommen, ein paar komplexere Animationen auszuprobieren. Das schon mehrfach erwähnte Buch Python Playground von Mahesh Venkitachalam enthält zum Beispiel Conways Game of Life und eine Boids-Simulation. Still digging!
Der in obigem Buch empfohlene Writer ImageMagick kann Loops, aber die Installation von ImageMagick auf meinem betagten MacBook Pro klappt nur hin und wieder, daher bin ich auf Pillow ausgewichen. ↩
Über …
Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!
Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.
Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.
Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes
von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.
Werbung
Diese Spalte wurde absichtlich leergelassen!