web-dev-qa-db-fra.com

Animations en ligne dans Jupyter

J'ai un script d'animation python (en utilisant funcAnimation de matplotlib)), qui fonctionne dans Spyder mais pas dans Jupyter. J'ai essayé de suivre diverses suggestions, telles que l'ajout de "% matplotlib inline" et la modification du backend matplotlib. "Qt4agg", tout cela sans succès. J'ai aussi essayé de lancer plusieurs exemples d'animations (tirés des tutoriels de Jupyter), dont aucune n'a fonctionné. Parfois, un message d'erreur s'affiche et l'intrigue apparaît, mais ne s'anime pas. have obtenu pyplot.plot () pour qu'il utilise "% matplotlib inline".

Quelqu'un connaît-il un ordinateur portable Jupyter en état de fonctionnement avec un exemple d'animation en ligne SIMPLE utilisant funcAnimation? Merci d'avance pour l'aide!

[Note: je suis sur Windows 7]

28
Ari Herman

ordinateur portable

"En ligne" signifie que les graphiques sont affichés sous forme de graphiques png. Ces images png ne peuvent pas être animées . Bien qu'en principe, on puisse créer une animation en remplaçant successivement les images png, ce n'est probablement pas souhaitable.

Une solution consiste à utiliser le bloc-notes du bloc-notes, qui est entièrement compatible avec FuncAnimation car il rend la figure de matplotlib elle-même:

%matplotlib notebook

jsanimation

À partir de matplotlib 2.1, nous pouvons créer une animation à l'aide de JavaScript. Ceci est similaire à la solution ani.to_html5(), sauf qu'elle ne nécessite aucun codec vidéo.

from IPython.display import HTML
HTML(ani.to_jshtml())

Quelques exemples complets:

import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np

t = np.linspace(0,2*np.pi)
x = np.sin(t)

fig, ax = plt.subplots()
ax.axis([0,2*np.pi,-1,1])
l, = ax.plot([],[])

def animate(i):
    l.set_data(t[:i], x[:i])

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))

from IPython.display import HTML
HTML(ani.to_jshtml())

Sinon, faites de jsanimation la valeur par défaut pour afficher les animations,

plt.rcParams["animation.html"] = "jshtml"

Puis, à la fin, indiquez simplement ani pour obtenir l’animation.

Voir aussi cette réponse pour un aperçu complet.

43

Voici un exemple simple dans ce tutoriel: http://louistiao.me/posts/notebooks/embedding-matplotlib-animations-in-jupyter-notebooks/

Pour résumer le tutoriel ci-dessus, vous avez essentiellement besoin de quelque chose comme ceci:

from matplotlib import animation
from IPython.display import HTML

# <insert animation setup code here>

anim = animation.FuncAnimation()  # With arguments of course!
HTML(anim.to_html5_video())

Cependant ...

J'ai eu beaucoup de difficulté à le faire fonctionner. En gros, le problème était que ce qui précède utilise (par défaut) ffmpeg et le x264 codec en arrière-plan mais ceux-ci n'ont pas été configurés correctement sur ma machine. La solution consistait à les désinstaller et à les reconstruire à partir du source avec la configuration correcte. Pour plus de détails, consultez la question que j'ai posée à ce sujet avec une réponse claire de Andrew Heusser: Animations dans le cahier ipython (jupyter) - ValueError: opération d'E/S sur un fichier fermé

Alors, essayez le to_html5_video La solution ci-dessus en premier, et si cela ne fonctionne pas, essayez également la désinstallation/la reconstruction de ffmpeg et x264.

11
Biggsy

Voici la réponse que j'ai composée de plusieurs sources, y compris les exemples officiels. J'ai testé avec les dernières versions de Jupyter et Python.

 
 importer numpy en tant que np 
 importer matplotlib.pyplot en tant que plt 
 importer matplotlib.animation en tant qu'animation 
 à partir de IPython.display importer HTML 
 
 # ====================================== 
 # Créer de fausses images à l’aide de Numpy 
 # Vous n’avez pas besoin de cela dans votre code car vous avez votre propre imageList. 
 # Ceci est utilisé à titre d’exemple. 
 
 imageList = [] 
 x = np.linspace (0, 2 * np.pi, 120) 
 y = np.linspace (0, 2 * np.pi, 100 ) .reshape (-1, 1) 
 pour i dans la plage (60): 
 x + = np.pi/15. 
 y + = np.pi/20. 
 imageList.append (np.sin (x) + np.cos (y)) 
 
 # ================ ======================== 
 # Animer de fausses images (dans Jupyter) 
 
 Def getImageFromList (x): 
 renvoie imageList [x] 
 
 fig = plt.figure (figsize = (10, 10)) 
 ims = [] 
 pour i dans la plage (len (imageList)): 
 im = plt.imshow (getImageFromList (i), animated = True) 
 ims.append ([im]) 
 
 ani = animation.ArtistAnimation (fig, ims , intervalle = 50, blit = True, repeat_delay = 1000) 
 plt.close () 
 
 # Afficher l'animation 
 HTML (ani.to_html5_video ()) 
 
 # ====================================== == 
 # Enregistrer l'animation sous forme de vidéo (si nécessaire) 
 # Ani.save ('dynamic_images.mp4') 
 
1
MosGeo