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 :

Modification amplitude d'une sinusoïde "dynamique"


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
    Néant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Néant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut Modification amplitude d'une sinusoïde "dynamique"
    Bonjour,

    Je m'inspire du code du site de matplotlib:
    https://matplotlib.org/3.1.0/gallery...ider_demo.html

    Dans mon programme, un point suit une sinusoïde (en affichant les positions successives) à l'aide de la fonction 'scatter' mais les curseurs tels qu'ils sont utilisés sur le site de matplotlib n'ont aucune incidence sur le graphe. En ajoutant la fonction 'scatter', je n'arrive pas à relier amplitude et fréquence aux curseurs afin de modifier "en temps réel" les paramètres de la sinusoïde.
    Merci pour vos réponses.

    Voici le code:

    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
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.widgets import Slider, Button, RadioButtons
     
    # fig, ax = plt.subplots()
    # plt.subplots_adjust(left=0.25, bottom=0.25)
     
    fig = plt.figure()
    ax = fig.add_subplot(111)
     
     
     
     
     
    t = np.arange(0.0, 1.0, 0.01)
    a0 = 5
    f0 = 3
    delta_f = 5.0
    s = a0 * np.sin(2 * np.pi * f0 * t)
    plt.axis([0, 1, -10, 10])
     
     
     
     
    axcolor = 'lightgoldenrodyellow'
    axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
    axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
     
    sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0, valstep=delta_f)
    samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)
     
     
    def update(val):
        amp = samp.val
        freq = sfreq.val
        l.set_ydata(amp*np.sin(2*np.pi*freq*t))
        fig.canvas.draw_idle()
     
     
    sfreq.on_changed(update)
    samp.on_changed(update)
     
    resetax = plt.axes([0.8, 0.025, 0.1, 0.04])
    button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975')
     
     
    def reset(event):
        sfreq.reset()
        samp.reset()
    button.on_clicked(reset)
     
    rax = plt.axes([0.025, 0.5, 0.15, 0.15], facecolor=axcolor)
    radio = RadioButtons(rax, ('red', 'blue', 'green'), active=0)
     
     
    def colorfunc(label):
        l.set_color(label)
        fig.canvas.draw_idle()
    radio.on_clicked(colorfunc)
     
     
    for i in range(1,100):
        x = t[i]
        s = a0 * np.sin(2 * np.pi * f0 * x)
        c = ax.scatter(x, s, c = 'red')
        x = t[i-1]
        s = a0 * np.sin(2 * np.pi * f0 * x)
        c = ax.scatter(x, s, c = 'white')
     
        plt.pause(0.05)
     
    plt.show()

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Salut,

    De toutes façons, si vous voulez relier quelque chose, c'est dans la fonction update que çà se passe... Mais peut être que vous voulez faire une animation genre oscilloscope.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Néant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Néant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Merci pour votre réponse.
    Non je ne souhaite pas faire une animation type oscilloscope. Merci pour la précision sur la fonction update mais je n'y arrive toujours pas.
    Faudrait-il intégrer les lignes suivantes dans la boucle for ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sfreq.on_changed(update)
    samp.on_changed(update)
    Merci.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Citation Envoyé par Tomashimalaya Voir le message
    Non je ne souhaite pas faire une animation type oscilloscope. Merci pour la précision sur la fonction update mais je n'y arrive toujours pas.
    Certes mais je comprends bien vous voulez visualiser une sinusoïde qui évolue en "temps réel" en faisant varier amplitude et fréquence: vous tourner le truc comme vous voulez, c'est une animation.

    Citation Envoyé par Tomashimalaya Voir le message
    Faudrait-il intégrer les lignes suivantes dans la boucle for ?
    Dans l'exemple dont vous vous inspirez, c'est "update" qui met à jour l'affichage.
    Dans votre code, vous le faites en ajoutant un point toutes les 0.05 secondes dans une boucle qui ignore les valeurs entrées dans les Slider dont les actions associées appellent toujours update...
    Si vous ne comprenez pas que çà ne peut pas fonctionner...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Néant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Néant
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Très bien, oui je pense avoir compris, merci beaucoup, en tout cas ça marche comme je veux !



    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
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib.widgets import Slider, Button, RadioButtons
    from math import *
     
    fig = plt.figure() 
    ax = fig.add_subplot(111)
    plt.subplots_adjust(left=0.25, bottom=0.25)
     
     
     
    axcolor = 'lightgoldenrodyellow'
    axfreq = plt.axes([0.25, 0.1, 0.65, 0.03], facecolor=axcolor)
    axamp = plt.axes([0.25, 0.15, 0.65, 0.03], facecolor=axcolor)
     
    sfreq = Slider(axfreq, 'Freq', 0.1, 30.0, valinit=f0, valstep=delta_f)
    samp = Slider(axamp, 'Amp', 0.1, 10.0, valinit=a0)
     
    t = np.arange(0.0, 1.0, 0.001)
    a0 = 5
    f0 = 3
    delta_f = 5.0
     
     
    for i in range(1,1000): 
        amp = samp.val
        freq = sfreq.val
        x = t[i]
        y = amp*cos(2*np.pi*freq*x)
        l = ax.scatter(x,y,c = 'red')
        x = t[i-1]
        y = amp*cos(2*np.pi*freq*x)
        l = ax.scatter(x,y,c = 'white')
        plt.pause(0.05)
     
     
    plt.show()

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Il faut définir f0 et a0 avant axfreq et axamp.
    Par ailleurs, on peut virer le module math et mettre np.cos pour y dans la boucle.

Discussions similaires

  1. [SQL] Modification de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 27/06/2006, 16h55
  2. [MySQL] transformer une simple quote en double pour un insert !!
    Par st0nky dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/01/2006, 16h38

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