matplotlib peut non seulement créer des graphiques, mais aussi des animations. Les principales fonctions de l'animation sont ArtistAnimation et FuncAnimation, mais ici, FuncAnimation est utilisé pour afficher l'animation de rotation comme indiqué ci-dessous.
— 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)
Créez une figue avec des plt.subplots et affichez 9 cercles avec Circle.
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])
Le cercle se déplace le long de la courbe de Lisaju. Utilisez np.hstack etc. pour déplacer petit à petit le mouvement de chaque cercle.
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 est le premier processus à être exécuté lorsque l'animation est exécutée, et comme rien n'est fait ici, seul le cercle est retourné. La mise à jour étant une fonction exécutée pour l'animation, chaque cercle est déplacé par set_center.
animation.FuncAnimation () vous permet de spécifier l'intervalle entre les chiffres. L'unité est la ms. Dans les cadres, vous pouvez définir le nombre d'exécutions de la fonction de mise à jour.
Vous pouvez enregistrer l'animation à la résolution spécifiée avec ani.save ('filename.mp4', writer = "ffmpeg", dpi = 100). Si ffmpeg n'est pas inclus
ffmpeg.py
conda install -c conda-forge ffmpeg
Mettons-le dedans. Vous pouvez afficher des animations dans jupyterlab et notebook avec HTML (ani.to_html5_video ()).
https://discourse.matplotlib.org/t/tunnel-animation/20733
J'ai écrit des articles sur diverses animations matplotlib sur Blog. Veuillez voir si vous êtes intéressé.
https://sabopy.com/category/py/matplotlib-animation/
Recommended Posts