IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Animation des changements d'état d'une matrice [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut Animation des changements d'état d'une matrice
    Bonjour à toutes et tous.

    Je suis débutant en python et essaye de réaliser, dans le cadre d'un projet de L2, un programme de simulation de type "modèle d'Ising".

    J'avance à taton, mais sans trop de difficultés depuis le début. (Beaucoup de bidouillage vu mon niveau, mais l'ensemble fonctionne plutôt bien)

    Cependant depuis hier je bloque sur la façon dont je peux animer les changements d'état de mon système.

    J'ai donc un programme qui me génère une liste contenant les différentes "photos" de ma matrice après chaque changement d'état.
    Jusqu'ici tout fonctionne.
    Ma liste que j'ai nommé "ListeImages" contient bien un nombre N de matrices carrées qui sont les "photos" du système aux différentes étapes.

    Là où ça coince, c'est lorsque j'essaye d'animer tout cela avec FuncAnimation de la bibliothèque matplotlib.animation.

    Dans le morceau de code ci-dessous la fonction genData() me pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def genData():
        return ListeImages[0]
     
    def updateData(frameNumber):
        mat.set_data(genData())
        return
     
    fig, ax = plt.subplots()
    mat = ax.matshow(genData())
    ani = animation.FuncAnimation(fig, updateData, interval=100)
    ani.save('systeme.mp4')
    En remplaçant "ListeImages" par une génération aléatoire de matrice comme par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def genData():
        return [np.random.rand(4) for _ in range(4)]
    Cela fonctionne parfaitement

    En fait, pour etre précis, je ne sais pas comment faire "cracher" à ma fonction genData les différentes images de ma matrice dans l'ordre...
    Comme par exemple je pourrais le faire avec une simple boucle de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    N = len(ListeImages)
    for a in range(N)
         b = ListeImages[N]
    et en interrogeant b

    ... j'ignore si je suis clair, mais j'essaie...

    Merci d'avance pour votre aide !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut
    Aucune bonne âme n'est inspiré ?

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Tes fonctions doivent dépendre de l'itération ! (ici frame number)
    Sinon forcément, comme tu l'as codé ca retourne toujours le premier élément (puisque tu as écris return ListeImages[0] avec en 0 en dur ... )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def genData(framenumber=0):
        return ListeImages[framenumber]
     
    def updateData(frameNumber):
        mat.set_data(genData(framenumber))
        return

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut
    Hooo
    Merci pour votre aide et votre réponse

    Je sais effectivement que dans mon exemple ça ne pouvait pas fonctionner. C'était pour mettre en forme mon "intention" d'extraire l'un apres l'autre les elements (matrices) de ListeImages

    J'ai essayé vos modifications, voici le code que je teste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def genData(framenumber=0):
        return ListeImages[framenumber]
     
    def updateData(frameNumber):
        mat.set_data(genData(framenumber))
        return
     
    fig, ax = plt.subplots()
    mat = ax.matshow(genData())
    ani = animation.FuncAnimation(fig, updateData, interval=100)
    ani.save('prout.mp4')
    et il me renvoi l'erreur :

    mat.set_data(genData(framenumber))

    NameError: global name 'framenumber' is not defined

    J'avoue ne pas savoir exactement ce que renvoi framenumber, je n'arrive pas a trouver d'aide dessus.
    J'imagine cependant qu'il doit s'agir du "numero" de l'image interrogée/affichée par l'animation ?

    Merci encore pour votre temps

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 064
    Par défaut
    frameNumber et ça ira mieux...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 12
    Par défaut
    Effectivement... a force de tourner en rond sur un problème on finit par ne plus voir les erreurs les plus grossières..

    Cependant,, après correction, j'ai cette erreur qui s'affiche :

    IndexError: list index out of range

    Je viens de tester avec d'avantage d'elements dans ma liste et je comprend que c'est lié à la dimension de ma liste qui n'a plus d'information a renvoyer au bout d'un certain temps si elle ne contient pas assez d'elements.

    Ma liste ListeImages est dépendante d'une variable N qui parametre le nombre d'iteration de mon programme et qui génère N matrices ensuite enregistrée dans cette même liste.

    Sa dimension len(ListeImages) est donc variable selon le nombre d'itération testées.

    Y a t'il un moyen de faire correspondre ce nombre d'éléments de ListeImages avec le nombre de "frame" créées par l'animation afin que celle-ci s'adapte quand je modifie le nombre d'iterations ?

    EDIT : Et merci pour votre aide également !! (.. j'avais oublié... )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changement d'état d'une entité
    Par WIM08 dans le forum Schéma
    Réponses: 6
    Dernier message: 22/05/2008, 01h46
  2. Réponses: 2
    Dernier message: 24/08/2007, 14h53
  3. Réponses: 4
    Dernier message: 08/01/2007, 14h48
  4. Gestion des changement de JPanel dans une applet
    Par le Daoud dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 26/06/2006, 14h32
  5. Théorie des graphes : Représentation GRAPHIQUE d'une matrice d'adjacence
    Par jm_gouy dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 03/05/2006, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo