matplotlib kann nicht nur Grafiken, sondern auch Animationen erstellen. Die Hauptfunktionen der Animation sind ArtistAnimation und FuncAnimation. Hier wird FuncAnimation verwendet, um die Rotationsanimation wie unten gezeigt anzuzeigen.
— sabopy.com (@Sabopy_com) January 31, 2020
import.py
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle
import matplotlib.animation as animation
from IPython.display import HTML
makefig.py
fig, ax = plt.subplots(figsize=(6,6))
#plot circle
c1 = Circle((0, 0), 5,color='0.75')
ax.add_patch(c1)
c2 = Circle((0, 0), 4.5,color='0.7')
ax.add_patch(c2)
c3 = Circle((0, 0), 4,color='0.65')
ax.add_patch(c3)
c4 = Circle((0, 0), 3.5,color='0.6')
ax.add_patch(c4)
c5 = Circle((0, 0), 3,color='0.55')
ax.add_patch(c5)
c6 = Circle((0, 0), 2.5,color='0.5')
ax.add_patch(c6)
c7 = Circle((0, 0), 2,color='0.45')
ax.add_patch(c7)
c8 = Circle((0, 0), 1.5,color='0.4')
ax.add_patch(c8)
c9 = Circle((0, 0), 1,color='0.35')
ax.add_patch(c9)
Erstellen Sie eine Feige mit plt.subplots und zeigen Sie 9 Kreise mit Circle an.
param.py
def f(a,t):
return np.cos(a*t)
def g(b,t,sig):
return np.sin(b*t+sig)
t = np.linspace(0,2*np.pi,200)
sig = np.pi/4
x=f(3,t)
y=g(2,t,sig)
x1 = np.hstack([x,np.ones(8)])
y1 = np.hstack([y,np.ones(8)*np.sin(sig)])
x2 = np.hstack([np.ones(1),x,np.ones(7)])
y2 = np.hstack([np.ones(1)*np.sin(sig),y,np.ones(7)*np.sin(sig)])
x3 = np.hstack([np.ones(2),x,np.ones(6)])
y3 = np.hstack([np.ones(2)*np.sin(sig),y,np.ones(6)*np.sin(sig)])
x4 = np.hstack([np.ones(3),x,np.ones(5)])
y4 = np.hstack([np.ones(3)*np.sin(sig),y,np.ones(5)*np.sin(sig)])
x5 = np.hstack([np.ones(4),x,np.ones(4)])
y5 = np.hstack([np.ones(4)*np.sin(sig),y,np.ones(4)*np.sin(sig)])
x6 = np.hstack([np.ones(5),x,np.ones(3)])
y6 = np.hstack([np.ones(5)*np.sin(sig),y,np.ones(3)*np.sin(sig)])
x7 = np.hstack([np.ones(6),x,np.ones(2)])
y7 = np.hstack([np.ones(6)*np.sin(sig),y,np.ones(2)*np.sin(sig)])
x8 = np.hstack([np.ones(7),x,np.ones(1)])
y8 = np.hstack([np.ones(7)*np.sin(sig),y,np.ones(1)*np.sin(sig)])
x9 = np.hstack([np.ones(8),x])
y9 = np.hstack([np.ones(8)*np.sin(sig),y])
Der Kreis bewegt sich entlang der Lisaju-Kurve. Verwenden Sie np.hstack usw., um die Bewegung jedes Kreises nach und nach zu verschieben.
xlimylim.py
xmin, xmax = xlim = x.min()-5, x.max()+5
ymin, ymax = ylim = y.min()-5, y.max()+5
ax.set(xlim=xlim, ylim=ylim, autoscale_on=False)
ax.set_aspect('equal')
ax.axis('off')
xlimylim.py
def init():
return c1, c2, c3, c4, c5, c6, c7,c8,c9,
def update(num):
c1.set_center([x1[num],y1[num]])
c2.set_center([x2[num],y2[num]])
c3.set_center([x3[num],y3[num]])
c4.set_center([x4[num],y4[num]])
c5.set_center([x5[num],y5[num]])
c6.set_center([x6[num],y6[num]])
c7.set_center([x7[num],y7[num]])
c8.set_center([x8[num],y8[num]])
c9.set_center([x9[num],y9[num]])
return c1, c2, c3, c4, c5, c6, c7,c8,c9
ani = animation.FuncAnimation(fig, update, init_func=init,interval = 20, frames = 208)
ani.save('Tunnel_animation.mp4', writer="ffmpeg",dpi=100)
HTML(ani.to_html5_video())
init ist der erste Prozess, der ausgeführt wird, wenn die Animation ausgeführt wird. Da hier nichts unternommen wird, wird nur der Kreis zurückgegeben. Da update eine Funktion ist, die für die Animation ausgeführt wird, wird jeder Kreis von set_center verschoben.
Mit animation.FuncAnimation () können Sie das Intervall zwischen den Abbildungen festlegen. Die Einheit ist ms. In Frames können Sie festlegen, wie oft die Aktualisierungsfunktion ausgeführt wird.
Sie können die Animation mit ani.save ('filename.mp4', writer = "ffmpeg", dpi = 100) in der angegebenen Auflösung speichern. Wenn ffmpeg nicht enthalten ist
ffmpeg.py
conda install -c conda-forge ffmpeg
Lassen Sie es uns einfügen. Sie können Animationen in Jupyterlab und Notebook mit HTML (ani.to_html5_video ()) anzeigen.
https://discourse.matplotlib.org/t/tunnel-animation/20733
Ich habe Artikel über verschiedene Matplotlib-Animationen auf Blog geschrieben. Bitte sehen Sie, ob Sie interessiert sind.
https://sabopy.com/category/py/matplotlib-animation/
Recommended Posts