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

MATLAB Discussion :

Rafraîchissement de figure


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 37
    Points : 38
    Points
    38
    Par défaut Rafraîchissement de figure
    Bonjour à tous,

    J'ai un problème qui revient régulièrement. Je souhaite afficher des figures qui varient selon certains paramètres, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i = 1:10
       x1 = 1:i;
       y1 = 3*x1;
       x2 = 1:2*i;
       y2 = 5*x1;
       figure(1); hold on
          plot(x1,y1)
          plot(x2,y2)
    hold off
    Bon l'exemple est un peu bidon , mais bon... Bref, si je fais ça, sûrement à cause du "hold on", les points s'accumulent sur la figure au lieu de se mettre à jour et de supprimer les valeurs du tour précédent.
    Je ne peux pas vraiment me passer du "hold on".
    Y a-t-il des solutions pour rafraîchir simplement les figures ?
    Merci d'avance ,
    L'hermine

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    En s’inspirant de ceci : Comment animer le tracé d'une courbe ?

    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
    figure('doublebuffer','on')
     
    p = plot(nan,nan,'r*',nan,nan,'b*');
     
    set(gca,'xlim',[0 25],'ylim',[0 55]);
     
    for i = 1:10
     
        x1 = i;
        y1 = 3*x1;
        x2 = 2*i;
        y2 = 5*x1;
     
        set(p(1),'xdata',x1,'ydata',y1);
        set(p(2),'xdata',x2,'ydata',y2);
     
        %    drawnow
        pause(.5)
     
    end
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 37
    Points : 38
    Points
    38
    Par défaut
    Merci Dut,

    J'étais effectivement tombé là-dessus avant de poster, mais je ne souhaite pas tracer les points les uns après les autres, mais bien une courbe différente à chaque itération.
    Surtout, comme j'ai plusieurs figures dans ma boucle, je ne peux pas les déclarer avant le "for". Si je rentre la figure dans la boucle il m'ouvre une nouvelle figure à chaque itération. À cause du "('doublebuffer','on')", je n'arrive plus à lui imposer un numéro de figure fixe, je n'ai pas trouvé la propriété dans "figure properties"...

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Commençons avec une seule fenêtre :

    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
    figure('doublebuffer','on')
     
    for i = 1:10
     
        x1 = 1:i;
        y1 = 3*x1;
        x2 = (1:2)*i;
        y2 = 5*x2;
     
        plot(x1,y1,x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
     
        % drawnow
        pause(.5)
     
    end
    Maintenant avec deux :

    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
    fig(1) = figure('doublebuffer','on');
    fig(2) = figure('doublebuffer','on');
     
    for i = 1:10
     
        x1 = 1:i;
        y1 = 3*x1;
        x2 = (1:2)*i;
        y2 = 5*x2;
     
        figure(fig(1));
        plot(x1,y1,x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
     
        % drawnow
        pause(.5)
     
        figure(fig(2));
        plot(x1,y1,x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
     
        % drawnow
        pause(.5)
     
    end
    Cela correspond mieux à ce que tu cherches à faire ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 37
    Points : 38
    Points
    38
    Par défaut
    Malheureusement, ça ne fonctionne toujours pas.
    J'ai une dizaine de plot() par figure avec pour chacun une couleur paramétrée différente des autres. Je pense donc que je ne peux pas me passer simplement du "hold on", non?
    Sur l'exemple si je sépare les deux courbes pour simuler le "hold on" :
    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
     
     
    fig(1) = figure('doublebuffer','on');
    fig(2) = figure('doublebuffer','on');
     
    for i = 1:10
     
        x1 = 1:i;
        y1 = 3*x1;
        x2 = (1:2)*i;
        y2 = 5*x2;
     
        figure(fig(1)); hold on;
        plot(x1,y1)
        plot(x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
        hold off
     
        % drawnow
        pause(.5)
     
        figure(fig(2));
        plot(x1,y1,x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
     
        % drawnow
        pause(.5)
     
    end
    alors les courbes s'accumulent à chaque itération...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    Je ne sais pas si ca va vraiment répondre à ce que tu cherches à faire, mais pourquoi ne pas utiliser la commande reset des figures?

    En reprenant ton exemple:

    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
    fig(1) = figure('doublebuffer','on');
    fig(2) = figure('doublebuffer','on');
     
    for i = 1:10
     
        x1 = 1:i;
        y1 = 3*x1;
        x2 = (1:2)*i;
        y2 = 5*x2;
     
        figure(fig(1)); 
        clf(fig(1),'reset')
        plot(x1,y1);hold on;
        plot(x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
     
        % drawnow
        pause(.5)
     
        figure(fig(2));
        plot(x1,y1,x2,y2)
        set(gca,'xlim',[0 25],'ylim',[0 105]);
     
        % drawnow
        pause(.5)
     
    end

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Bien que la solution de Merel devrait fonctionner correctement, je pense que tu te compliques la vie..

    Si tu veux qu'on t'aide efficacement, le mieux serait de nous montrer ton code.
    Ou au moins un exemple moins "bidon" que celui de ton premier message
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  8. #8
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Hello,
    une solution analogue à celle de Merel est de modifier une propriété de la figure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fig(1) = figure;
    set(fig(1),'NextPlot','replaceChildren');
    for i=1:10 %...
    Qui décrit comment dessiner le plot suivant :
    Citation Envoyé par doc matlab
    How to add next plot. Determines which figure MATLAB uses to display graphics output. If the value of the current figure is replacechildren — Remove all child objects, but do not reset figure properties (equivalent to clf)

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 37
    Points : 38
    Points
    38
    Par défaut
    Parfait , merci à vous trois.
    Avec le "reset" de Merel ça marche très bien.
    J'ai tout de même rajouté un "pause(.1)", sinon la figure clignote et l'évolution n'est plus lisible.

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

Discussions similaires

  1. Problème d'affichage de figure
    Par perlgirl dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 03/09/2004, 09h53
  2. Rafraîchissement sur un endroit de la fenêtre
    Par Mynautor dans le forum OpenGL
    Réponses: 5
    Dernier message: 07/06/2004, 14h47
  3. [GEF]class Figure dans container SWING ?
    Par Albarad dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/06/2004, 12h12
  4. Problème de rafraîchissement de données...
    Par Alain Dionne dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/03/2004, 21h07
  5. "Non rafraîchissement" d'un contrôle
    Par Nico LN dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 11h50

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