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 :

Problème Animation Python (module matplolib)


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2019
    Messages : 3
    Par défaut Problème Animation Python (module matplolib)
    Bonjour à tous,

    Je planche sur un programme sur lequel l'insertion d'animations est nécessaire.
    Cependant, je n'ai jamais utilisé le module animation de matplotlib donc j'ai quelques soucis.
    Je souhaite faire défiler sur une même figure une succession de matrices (je modélise un déplacement, un peu à la manière de snake, donc l'animation simule le mouvement de mon pixel sur la matrice).
    Pourriez-vous m'aider au niveau de la façon dont cela peut s'écrire s'il vous plaît?

    Cordialement.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Vagabong étudiant en annalyse du signal.
    Inscrit en
    Avril 2019
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Vagabong étudiant en annalyse du signal.
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2019
    Messages : 130
    Par défaut exemple
    bonsoir,
    voici un exemple d'animation, je te laisse d'abord essayer de l'adapter à ton sujet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt
    import math
     
     
    def animation(angle_vertical):
    	from mpl_toolkits.mplot3d import Axes3D
    	import matplotlib.pyplot as plt
    	import numpy as np
    	import matplotlib
    	import math
     
     
    	fig = plt.figure()
    	ax = fig.gca(projection='3d')
     
     
    	#creation des données
    	X = np.linspace(-4, 4, 100)
    	Y = np.linspace(-4, 4, 100)
    	#Z = np.array([[math.cos(math.sqrt(y**2+x**2))+0.1*math.sin(x**2+y**2) for y in Y] for x in X])
    	Z = np.array([[x*y/(x**2+y**2) for y in Y] for x in X])
    	X, Y = np.meshgrid(X, Y)
     
     
    	#ax.plot_surface(X, Y, Z, cmap=matplotlib.cm.Spectral)
    	#help(matplotlib.cm)
    	ax.plot_surface(X, Y, Z, cmap=matplotlib.cm.Purples)
    	ax.plot_surface(X, Y, Z, cmap=matplotlib.cm.Reds)
     
    	for angle in range(0, 360//4, 1):
    		ax.view_init(angle_vertical, angle)
    		plt.draw()
    		plt.pause(.01)
    	plt.close()
     
    	return angle_vertical
     
    def surface(f,xmin=-10,xmax=10,ymin=-10,ymax=10):
    	"""
            affiche les courbes en 3d
            affiche un surface
            """
    	from mpl_toolkits.mplot3d import Axes3D
     
    	#calcul de la fonction
    	X = np.linspace(xmin,xmax,1000)
    	Y = np.linspace(ymin,ymax,1000)
    	Z = np.array([[f(float(x),float(y)) for y in Y] for x in X])
    	X, Y = np.meshgrid(X, Y)
     
    	#affichage simple
    	fig = plt.figure()
    	ax = fig.gca(projection="3d")
    	ax.plot_surface(X, Y, Z)
    	plt.show()
     
    def vrai_surface(gf,gxmin,gxmax,gymin,gymax):
    	"""
            fait une animation en 3D des courbes
            """
    	pass
     
     
     
    def f(x,y):
    	return math.cos(math.sqrt(y**2+x**2))+0.1*math.sin(x**2+y**2)
     
     
    animation(35)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2019
    Messages : 3
    Par défaut Souci en 2D
    Je vois l'idée du programme que vous m'avez envoyé, mais il se trouve qu'il est déjà plus "avancé" en terme de difficulté.

    En effet, dans mon problème il est uniquement question de 2D, je souhaite faire défiler plusieurs matrices sur une même figure, or dans le programme que j'ai commencé (voir ci-dessous) chaque nouveau calcul apparaît sur une nouvelle figure...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def Animation_Deplacement_Poissons(n,nbr_animaux,t):
        Carte = Placement_Aleatoire(n,nbr_animaux)
        plt.imshow(Carte.astype('uint8'), cmap = 'gray', interpolation = 'nearest')
        plt.axis('off')
        for time in range(t):
            Carte = Deplacement_Poissons_Elementaire_Recursif(n,nbr_animaux,Carte)
            plt.imshow(Carte.astype('uint8'), cmap = 'gray', interpolation = 'nearest')
            plt.pause(3)
    Voyez-vous ce qu'il y a à modifier (sachant qu'ici je n'utilise même pas le module animation...) ?

  4. #4
    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
    Il faut faire une figure, récupérer l'alias de l'objet plotté, puis se servir de cet alias pour mettre à jour les données. Et non pas retracer une nouvelle figure à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
     
    k = 2*np.pi
    w = 2*np.pi
    dt = 0.01
     
    xmin = 0
    xmax = 3
    nbx = 100
     
    x = np.linspace(xmin, xmax, nbx)
     
    fig = plt.figure() # initialise la figure
    line, = plt.plot([],[]) 
    plt.xlim(xmin, xmax)
    plt.ylim(-1,1)
     
    # fonction à définir quand blit=True
    # crée l'arrière de l'animation qui sera présent sur chaque image
    def init():
        line.set_data([],[])
        return line,
     
    def animate(i): 
        t = i * dt
        y = np.cos(k*x - w*t)
        line.set_data(x, y)
        return line,
     
    ani = animation.FuncAnimation(fig, animate, init_func=init, frames=100, blit=True, interval=20, repeat=False)
     
    plt.show()

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2019
    Messages : 3
    Par défaut ValueError: too many values to unpack (expected 2)
    Je vois mieux lg_53, merci.

    J'ai donc écrit l'animation comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
     
    Carte = Placement_Aleatoire(10,4) #matrice 10*10 avec 4 "pixels animaux#
     
    fig = plt.figure() # initialise la figure
    line, = plt.plot([],[]) 
    plt.xlim(1, 100)
    plt.ylim(1,100)
     
    def init():
        line.set_data([],[])
        return line,
     
    def animate(i):
        t = i*dt
        line.set_data(Deplacement_Poissons_Elementaire_Recursif(10,4,Carte)) #bouge l'animal d'un pixel par rapport à l'instant t-1
        return line,
     
    ani = animation.FuncAnimation(fig, animate, init_func=init, frames=5, blit=True, interval=1000, repeat=False)
     
    plt.show()
    Cependant, le message d'erreur : " line 657, in set_data, (x, y), = args
    ValueError: too many values to unpack (expected 2) " apparaît.

    Pourtant mon Deplacement_Poissons_Elementaire_Recursif(10,4,Carte) renvoie un tableau 2D de taille 10*10 donc je ne vois pas où se trouve le problème...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def Deplacement_Poissons_Elementaire_Recursif(n,nbr_animaux,Carte):
        for i in range (n):
            for j in range(n):
                if Carte[i,j][0]==255.0:
                    a,b = randint(-1,1),randint(-1,1)
                    if i+a<0 or i+a>n-1 or j+b<0 or j+b>n-1 or Carte[i+a,j+b][0]==255 or (Carte[i+a,j+b][0]==0 and Carte[i+a,j+b][2]==0):
                        Carte[i,j]=Carte[i,j]
                    else:
                        Carte[i,j],Carte[i+a,j+b]=(0,0,128),(255,0,0)
        return(Carte)
    Merci de bien vouloir m'aider une dernière fois s'il vous plaît :/

  6. #6
    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
    Oui je vous ai montrer l'exemple avec plot, qui trace une courbe à partir de couples de points (x,y) (et donc d'un tableau 2xN (ou Nx2, je ne sais plus) ). Maintenant si vous vous avez besoin d'une matrice, avec imshow, sur la base de l'exemple donné pour la fonction plot, une brève recherche google vous donne ce qu'il vous faut :

    https://matplotlib.org/examples/anim...mic_image.html

Discussions similaires

  1. Python anaconda problème avec le module Tkinter
    Par MorbusGravis dans le forum Tkinter
    Réponses: 0
    Dernier message: 30/11/2019, 20h31
  2. Python 3.6. : problème avec le module PyX
    Par draperdon830 dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 11/02/2017, 09h47
  3. CGI/Python, module gnomevfs, et problème de permissions
    Par Maxhysteria dans le forum Apache
    Réponses: 1
    Dernier message: 25/11/2007, 19h18
  4. problème avec le module DBI
    Par vbcasimir dans le forum SGBD
    Réponses: 6
    Dernier message: 08/10/2005, 12h48
  5. problème avec un module
    Par vbcasimir dans le forum Modules
    Réponses: 2
    Dernier message: 29/08/2005, 15h59

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