Mit der matplotlib von Python können Sie auf einfache Weise gut aussehende Diagramme erstellen. Die Funktion zum Erstellen von Diagrammanimationen ist in matplotlib ebenfalls standardmäßig enthalten. Hier finden Sie eine umfassende Zusammenfassung der Verwendung.
Es werden zwei Hauptmethoden angeboten:
--Animation durch Übergeben einer Liste vorgefertigter Diagrammobjekte (ArtistAnimation)
Der Grund für Ersteres ist Artist Animation, da matplotlib Grafikobjektkünstler nennt. Diesen Namen werden wir auch hier verwenden. Wenn Sie eine gewisse Leistung benötigen oder den Titel oder die Feinsteuerung in der Animation ändern müssen, sollten Sie Letzteres auswählen.
Lassen Sie uns jeweils ein Codebeispiel vorstellen.
ArtistAnimation
Übergabe an ArtistAnimation ist eine Liste der Künstlerliste [^ 1]. Wenn jedes Bild der Animation durch Bild 1, Bild 2, ... dargestellt wird,
[
[
Künstler in Bild 1 angezeigt_1,Künstler in Bild 1 angezeigt_2, ...
],
[
Künstler in Bild 2 angezeigt_1,Künstler in Bild 2 angezeigt_2, ...
],
...
]
Es wird sein. Beachten Sie, dass einige Matplotlib-Diagrammtypen und -Funktionen Künstler und andere eine Liste von Künstlern zurückgeben. Im folgenden Beispiel wird beispielsweise nur die Liste der von der Plotfunktion zurückgegebenen Künstler angehängt.
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np
fig, ax = plt.subplots()
artists = []
x = np.arange(10)
for i in range(10):
y = np.random.rand(10)
im = ax.plot(x, y)
artists.append(im)
anim = ArtistAnimation(fig, artists, interval=1000)
fig.show()
Hängen Sie für Funktionen, die einen Künstler zurückgeben, wie z. B. Scatter, die in die Liste eingeschlossene an.
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
import numpy as np
fig, ax = plt.subplots()
artists = []
x = np.arange(10)
for i in range(10):
y = np.random.rand(10)
im = ax.scatter(x, y)
artists.append([im])
anim = ArtistAnimation(fig, artists, interval=1000)
fig.show()
FuncAnimation
Für jedes Bild der Animation wird eine Funktion aufgerufen. Es kann zwei Verarbeitungsmuster geben:
--Erstelle jedes Mal einen neuen Künstler (du musst den zuvor erstellten Künstler behalten und explizit löschen)
Ich werde jeden Code vorstellen.
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots()
ims = []
x = np.arange(10)
ax.set_xlim(0, 9)
ax.set_ylim(0, 1)
def update_anim(i):
y = np.random.rand(10)
if len(ims) > 0:
im = ims.pop()
im.remove()
im, = ax.plot(x, y)
ims.append(im)
anim = FuncAnimation(fig, update_anim, interval=1000)
fig.show()
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots()
artists = []
im, = ax.plot([], [])
x = np.arange(10)
ax.set_xlim(0, 9)
ax.set_ylim(0, 1)
def update_anim(frame):
y = np.random.rand(10)
im.set_data(x, y)
anim = FuncAnimation(fig, update_anim, blit=False)
fig.show()
Das Aktualisieren von Daten ist natürlich effizienter.
blit=True
Wenn Sie das optionale Argument "blit" auf "True" setzen, können Sie das Zeichnen anscheinend weiter beschleunigen, indem Sie die in der Computergrafik verwendete Technik "blitting" verwenden. In diesem Fall muss die Liste der Künstler zurückgegeben werden, die aus der Funktion entfernt werden sollen.
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
fig, ax = plt.subplots()
artists = []
im, = ax.plot([], [])
x = np.arange(10)
ax.set_xlim(0, 9)
ax.set_ylim(0, 1)
def update_anim(frame):
y = np.random.rand(10)
im.set_data(x, y)
return im,
anim = FuncAnimation(fig, update_anim, blit=True)
fig.show()
Die erstellte Animation kann wie folgt in einer Datei gespeichert werden.
Export nach GIF
anim.save('anim.gif', writer='imagemagick', fps=4)
Export nach mp4
anim.save('anim.mp4', writer='ffmpeg', fps=4)
Wenn Sie an einem Jupyter-Notizbuch arbeiten, können Sie "% matplotlib nbagg" anstelle von "% matplotlib inline" angeben, um ein Diagramm anzuzeigen, mit dem der Benutzer inline interagieren kann. Eine Animation wird ebenfalls ausgeführt. Es ist jedoch schwer und wird im nbviewer nicht angezeigt. Wenn Sie es also nur inline anzeigen möchten, wird empfohlen, das Video wie folgt einzubetten.
from IPython.display import HTML
HTML(anim.to_html5_video())
[^ 1]: Im Allgemeinen iterierbare Objekte, mit denen for-Schleifen erstellt werden können. Hier wird es allgemein als Liste bezeichnet.
Recommended Posts