web-dev-qa-db-fra.com

Animation dans le cahier iPython

J'essaie de mettre des animations dans un ordinateur portable iPython et je ne trouve pas de solution. J'ai lu un article qui traitait de l'utilisation de widgets interactifs, mais il y a quelques problèmes que j'ai avec ceci: Tout d'abord, chaque exemple que je vois avec des widgets utilise un curseur ou une autre entrée, alors que je veux simplement que l'animation s'exécute automatiquement lorsque la cellule est couru. Deuxièmement, toute la documentation semble périmée sur le site de Jupyter - chaque fois que je télécharge et exécute leurs cahiers, je reçois ces messages à propos de certains modules obsolètes, puis quelque chose ne fonctionne pas dans le fichier, probablement parce qu'ils essaient d'importer et accéder aux fichiers qui n'existent plus. 

J'ai vu quelques autres pages sur le sujet, mais elles nécessitent souvent le téléchargement de fichiers binaires ou d'autres modules, mais je l'utilise en partie pour enseigner les mathématiques à certains étudiants et je leur ai demandé de télécharger Anaconda - j'espérais ne pas en faire plus confondez le problème en leur faisant également télécharger et installer des choses plus compliquées tout en passant du temps à ne pas parler de Math.

En bref, y a-t-il un moyen de créer des animations dans un ordinateur portable iPython qui nécessitent uniquement l'utilisation de commandes d'importation simples qui s'exécutent immédiatement pour pouvoir utiliser le logiciel fourni par Anaconda?

[Edit: je dois aussi noter que j'ai utilisé Tkinter pour créer des animations, et je pourrais en créer une dans matplotlib, j'en suis sûr. Donc, s’il était possible d’obtenir les animations que vous produisez avec celles à restituer dans un bloc-notes iPython, ce serait certainement une solution efficace pour moi.]

[Autre édition: Je suppose que je pourrais aussi dire ce que j'espère animer pour le moment, bien que je veuille vraiment être assez flexible sur l'éventail de choses que je pourrais animer si je le décidais. À l'heure actuelle, j'essaie de créer une horloge numérique affichant chaque chiffre en chiffres sumériens en base 60 pour illustrer un système de comptage et de base différent. Donc, il devrait initialement afficher | puis après une seconde || et ainsi de suite jusqu'à ce que dix soit représenté par <et ainsi de suite jusqu'à ce que le temps passe finalement à une minute où il affiche désormais |: | représenter une minute, une seconde.]

15
Addem

Certaines options que vous avez pour animer des tracés dans Jupyter/IPython, en utilisant matplotlib:

  • Utilisation de display dans une boucle Utilisez IPython.display.display(fig) pour afficher un chiffre dans la sortie. En utilisant une boucle, vous voudriez effacer la sortie avant qu'une nouvelle figure ne soit affichée. Notez que cette technique donne en général des résultats pas très lisses. Je conseillerais donc d'utiliser l'un des éléments ci-dessous.

    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    from IPython.display import display, clear_output
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    for i in range(len(x)):
        animate(i)
        clear_output(wait=True)
        display(fig)
        
    plt.show()

  • %matplotlib notebookUtilisez la magie IPython %matplotlib notebook pour définir le backend sur le backend du notebook. Cela gardera la figure en vie au lieu d'afficher un fichier png statique et pourra donc également afficher des animations.
    Exemple complet:

    %matplotlib notebook
    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()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()

  • %matplotlib tkUtilisez la magie IPython %matplotlib tk pour définir le backend sur le backend tk. Cela ouvrira la figure dans une nouvelle fenêtre de traçage, qui est interactive et peut donc également afficher des animations.
    Exemple complet:

    %matplotlib tk
    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()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()

  • Convertir une animation en vidéo mp4 (option déjà mentionnée par @Perfi): 

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

    ou utilisez plt.rcParams["animation.html"] = "html5" au début de l'ordinateur portable . Cela nécessitera de disposer de codecs vidéo ffmpeg disponibles pour la conversion en vidéo HTML5. La vidéo est ensuite affichée en ligne. Ceci est donc compatible avec %matplotlib inline backend. Exemple complet:

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "html5"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    %matplotlib inline
    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()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda 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_html5_video())

  • Convertir une animation en JavaScript

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

    ou utilisez plt.rcParams["animation.html"] = "jshtml" au début du cahier ..____ Ceci affichera l'animation au format HTML avec JavaScript. Ceci est hautement compatible avec la plupart des nouveaux navigateurs et également avec le backend %matplotlib inline. Il est disponible dans matplotlib 2.1 ou supérieur.
    Exemple complet:

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "jshtml"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    %matplotlib inline
    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()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda 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())

25

Vous pouvez trouver ce tutoriel intéressant.

Si vous pouvez transformer ce dont vous avez besoin en une animation matplotlib, et que, d'après votre description, cela est possible, vous pouvez alors utiliser

from matplotlib import rc, animation
rc('animation', html='html5')

et affichez votre animation en utilisant

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=N, interval=20, blit=True)
anim

Pourrait être utile!

12
Perfi

Les widgets Jupyter sont un bon moyen d’afficher des animations. Le code ci-dessous affiche un gif animé .....

from ipywidgets import Image
from IPython import display
animatedGif = "animatedGifs/01-progress.gif" #path relative to your notebook
file = open(animatedGif , "rb")
image = file.read()
progress= Image(
    value=image,
    format='gif',
    width=100,
    height=100)
display.display(progress)

Vous pouvez fermer cette animation en utilisant:

progress.close()

N.B. J'ai trouvé quelques jolis gifs animés dans http://www.downgraf.com/inspiration/25-beautiful-loading-bar-design-examples-gif-animated/

2
DougR

J'ai eu un problème similaire, et cette question m'a aidé à démarrer. J'ai mis au point un cahier illustrant l'utilisation de FuncAnimation avec de bonnes explications sur les raisons pour lesquelles le cahier fait certaines choses comme il le fait. Il contient également des liens vers des instructions sur FFmpeg. Il contient également des liens vers les exemples que j'ai utilisés pour développer et comprendre les animations. Vous pouvez voir ma contribution à: Illustration d'animation

Pour votre question, vous trouverez peut-être que les curseurs interactifs sont un meilleur outil. J'ai également créé un bloc-notes illustrant des widgets interactifs dans Jupyter. Il est disponible ici ; cependant, les parties interactives ne fonctionnent pas là.

Les deux sont disponibles dans un répertoire - GitHub Repostory

2
Will Holmes