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 :

Exécution répétée d'une même fonction


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2020
    Messages : 10
    Par défaut Exécution répétée d'une même fonction
    Bonjour,

    Je travaille avec python v3.7.3 et matplotlib v3.2.1.
    J'ai créé une fonction qui me permet d'afficher un graphique.
    Cette fonction ne pose aucun problème ou presque.
    En effet, je crée un graphique en fonction d'une fréquence selon un capteur scientifique.

    Sauf que pour certains capteurs, je dois exécuter plusieurs fois cette fonction car j'ai plusieurs fréquences.

    Je souhaiterai visualiser ces graphiques en même temps, au fur et à mesure de l'exécution de la fonction.
    Hors ce n'est pas possible pour le moment car je dois fermer le graphique en cours pour visualiser le suivant.

    Voici mon type d'appel multiples de la même fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            fmdb.graphe(nomPorteur, nomCapteur, Vitesse, Noise200, 200, paramGraphe, paramAffichage)
            fmdb.graphe(nomPorteur, nomCapteur, Vitesse, Noise300, 300, paramGraphe, paramAffichage)
            fmdb.graphe(nomPorteur, nomCapteur, Vitesse, Noise380, 380, paramGraphe, paramAffichage)
    Voici le code de la fonction affichant le graphique :
    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
    def graphe(nomPorteur, nomCapteur, triVitesse, triFinal, Freq, save, affichage):
     
        graphique = plt.figure (figsize=(9, 5))
     
        # Choix d'une abscisse (nombre de canal) différente en fonction du capteur
        if nomCapteur in ["EM2040c", "Em2040c", "em2040c", "EM2040p", "Em2040p", "em2040p"]:
            Abscisse = np.linspace (1, 96, 96)
        elif nomCapteur in ["EM710", "Em710", "em710", "EM122", "Em122", "em122", "EM1002", "Em1002", "em1002",
                            "EM302", "Em302", "em302", "EM712", "Em712", "em712"]:
            Abscisse = np.linspace (1, 128, 128)
        elif nomCapteur in ["EM3002", "Em3002", "em3002"]:
            Abscisse = np.linspace (1, 80, 80)
     
        # Palette de couleur restreignant le nombre de fichier à 8
        couleur = ["blue", "cyan", "green", "brown", "yellow", "orange", "red", "black"]
     
        # Création des graphiques
        for d in range (0, len (triFinal[0])):
            plt.plot(Abscisse, triFinal[:, d], color=couleur[d], linewidth=1.5,
                      label=str (int (triVitesse[d])) + ' Nds')
            if nomCapteur in ["EM2040c", "Em2040c", "em2040c", "EM2040p", "Em2040p", "em2040p"]:
                plt.xlim (0, 97)
                plt.xticks (np.linspace (0, 95, 20, endpoint=True))
            elif nomCapteur in ["EM710", "Em710", "em710", "EM122", "Em122", "em122", "EM1002", "Em1002",
                                "em1002", "EM302", "Em302", "em302", "EM712", "Em712", "em712"]:
                plt.xlim (0, 130)
            elif nomCapteur in ["EM3002", "Em3002", "em3002"]:
                plt.xlim (0, 82)
     
        # les lignes suivantes permettent de gérer les légendes, titres et sauvegardes des graphiques
        plt.legend (loc='upper right', fontsize='x-small', fancybox=0, shadow=1, bbox_to_anchor=(1.13, 0.7))
        plt.xlabel ('Numero du canal')
        plt.ylabel ('Niveau en dB')
        plt.title ('Mesure de bruit (dB) en fonction de la vitesse du navire (Nds) \n (' +
                   nomPorteur + ' - ' + nomCapteur + ' - Frequence ' + str (Freq) + ' kHz)')
        plt.grid (color='pink', linestyle='-', axis='y')
     
        if save == True:
            plt.savefig ('Niveau_bruit_' + str (nomPorteur) + '_' + nomCapteur + '_' + str (Freq) + '_kHz',
                         dpi=500, orientation='landscape')
     
        if affichage == True:
            plt.show (block=graphique)
     
        else:
            plt.close (graphique)
    D'avance merci à ceux qui pourront m'aider
    Bonne santé à tous

  2. #2
    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
    Vous pouvez très bien modifier le graphique sans avoir à le fermer et le recrééer à chaque fois !
    Essayez ce code sans sa dernière ligne, puis avec et voyez.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fig, ax = plt.subplots()
    line, = ax.plot(x, np.sin(x))
    line.set_ydata(np.sin(0.01*x))
    Vous devriiez pouvoir utiliser la même mécanique dans votre cas, en mettant simplement à jour les donnés contenus dans votre graphique (via set_ydata).

  3. #3
    Membre habitué
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Avril 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2020
    Messages : 10
    Par défaut Pas tout compris
    Salut lg_53,

    Merci pour ta réponse mais je n'ai pas compris ce que je devais avec tes 2 premières lignes de code et le mien.

    Pourrais-tu m'expliquer ces 2 lignes, s'il te plait ?

    Merci.

  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 y a plusieurs manières de créer des graphiques.
    La manière facile :

    qui devient vite limitée quand on veut faire des choses un peu particulière. Et après il y a les méthodes avec un peu plus de lignes, mais qui permettent de capturer les objets graphiques dans des variables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fig, ax = plt.subplots()
    line, = ax.plot(x, np.sin(x))
    qui est l'équivalent de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fig = plt.figure()   ### Je créé une figure (une fenêtre graphique)
    ax = fig.add_subplot(1,1,1)   ### Dans cette figure je créé un jeu d'axe. Il pourrait y en avoir plusieurs
    line, = ax.plot(x, np.sin(x))  ### Dans cet axe, je trace la courbe (line) donnée, dont je récupère aussi l'instance
    Et une fois que vous avez capturez tout ca dans des variables, qui sont des instances de classes, et bien rien ne vous prive de faire des print de ces trucs là pour voir ce que c'est et d'invoquer dir(mon_objet) ou mon_objet.__dict__ pour voir ce qu'il y a dedans.

    Dans votre cas, l'objet line contient une méthode set_ydata, qui me semble convenir à votre besoin, puisque ca va juste modifier les valeurs de la ligne, tout en restant avec la figure et le jeu d'axe de départ.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/02/2008, 20h05
  2. [PHP-JS] PHP et Javascript pour une même fonction
    Par 'ti programmeur dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2008, 20h33
  3. Réponses: 5
    Dernier message: 25/05/2007, 17h53
  4. Réponses: 10
    Dernier message: 08/02/2007, 13h18
  5. TForm pour plusieurs fenêtre dans une même fonction ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 15/11/2005, 12h38

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