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 :

[Plotyy][multi-plot] Hold on qui ne hold pas du tout !


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2013
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [Plotyy][multi-plot] Hold on qui ne hold pas du tout !
    Bonjour,

    Le développement de mon code de traçage de figure me pose pas mal de soucis en ce moment...
    Je souhaite tracer le résultat de différentes simulations correspondant à plusieurs stations de mesures sur une figure.
    En simple:
    - 1 figure -> 6 sous-figures
    - sur chaque sous-figure devrait être tracé la série d'observation et "n" séries simulées

    Mon principale problème: j'arrive à tracer une série simulée, mais si j'en mets plusieurs la plus récente remplace l'ancienne.

    J'ai testé hold on, hold all, à plusieurs emplacements dans le code mais rien n'y fait.

    J'utilise la fonction axe pour créer mes sous-figures et les placer où je le souhaite car la fonction subplot me crée des marges énormes et ne permet pas du tout d'optimiser la place sur les figures...

    Voici les deux codes que j'utilise (version simplifiées en 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
    28
    29
    30
    31
    32
    figure;
                    NbEpisodes=12;
                    NbBestCompro=5;
                    NbSubplot=1;
     
                    mBot=0.02; mTop=0.03; mSides=0.05; mInterVerti=0.02; mInterHori=0.08; nbColSubplots=3; nbLignesSubplots=2; wLeg=0.1;
                    wFig= (1 - mSides*2 - mInterVerti*(nbColSubplots-1) - wLeg)/nbColSubplots ; % Calcule la largeur max possible pour chaque subplot
                    eFig= (1-0.06*nbLignesSubplots - mTop - mBot - mInterHori*(nbLignesSubplots-1))/nbLignesSubplots ; % Calcule la hauteur max possible pour chaque subplot
     
                    Sub_Var=cell(1,NbEpisodes); % Tableau de cellules qui va recevoir l'ensemble des 'handles' des subplots
     
                    c=0;
                    for ligne=1:NbEpisodes/6 % permet d'avoir 2 lignes sur les figures
                        for colo=1:NbEpisodes/4 % permet d'avoir 3 colonnes sur les figures
                            c=c+1;
     
                            for z2=1:NbBestCompro
                                Sub_Var{NbSubplot}=axes('Position', [mSides+(colo-1)*wFig+(colo-1)*mInterVerti ,...
                                                                     mBot+(nbLignesSubplots-ligne)*eFig+(nbLignesSubplots-ligne+1)*mInterHori ,...
                                                                     wFig , eFig] , 'Units', 'Normalized'); % Positionne le subplot pour l'épisode en cours
     
                                   [H1, H2]=TracePlot(c,z2,NbBestCompro);
     
                            end
                            NbSubplot=NbSubplot+1;
                        end
                    end
     
                LegPos=axes('Position', [0.85 0.1 0.12 0.5], 'Units', 'Normalized'); 
                axis off
                h=legend(LegPos,[H1;H2],'Obs-20','Sim-20','Obs-40','Sim-40','Obs-60','Sim-60','Rain');
                set(h,'color','w', 'fontsize',10);
    et le code de la fonction "TracePlot" qui fait le travail de traçage:

    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
    function [H1, H2]=TracePlot(c,ite,iteMax)
     
    o1=rand(1,4)';
    s1=o1+0.02;
    o2=rand(1,4)';
    s2=o2+0.015;
    o3=rand(1,4)';
    s3=zeros(4,1);
    for i=1:4
        if o3(i)-0.07<0
            s3(i)=0;
        else
            s3(i)=o3(i)-0.07;
        end
    end
     
    [AX,H1,H2]=plotyy(1:4,[o1,s1,o2,s2,o3,s3],1:4,rand(1,4)'*2,'plot','bar');
     
    title(strcat({'Episode: '},{int2str(c)}), 'FontSize',10,'FontWeight','bold');
    set(AX,{'ycolor'},{'k';'b'})
     
    if ite==iteMax % Dernières valeurs
            set(H1(1),'color',[0 0 0],'LineStyle','o','markersize',3); 
            set(H1(2),'color',[0 0 0],'LineStyle','-');
     
            set(H1(3),'color',[0.0 0.6 0.3],'LineStyle','s','markersize',3);
            set(H1(4),'color',[0.0 0.6 0.3],'LineStyle','-');
     
            set(H1(5),'color',[0.8 0.3 0.6],'LineStyle','^','markersize',3);
            set(H1(6),'color',[0.8 0.3 0.6],'LineStyle','-');
    else
            set(H1(1),'color',[0.0 0.0 0.0],'LineStyle','o','markersize',3);
            set(H1(2),'color',[0.7 0.7 0.7],'LineStyle','-');
     
            set(H1(3),'color',[0.0 0.6 0.3],'LineStyle','s','markersize',3);
            set(H1(4),'color',[0.5 0.9 0.4],'LineStyle','-');
     
            set(H1(5),'color',[0.8 0.3 0.6],'LineStyle','^','markersize',3);
            set(H1(6),'color',[1.0 0.6 0.8],'LineStyle','-');
    end
     
    set(AX(1),'YLim',[0 1.5],'YTick',0:0.5:5);
    if c==1 || c==4 || c==7 || c==10 % N'affiche le titre de l'axe des ordonnées que pour le premier épisode de chaque ligne
        set(AX(1),'YTickLabel',sprintf('%.2f|',0:0.5:5),'FontSize',8)
        ylabel('Ordonnee1','color','k','FontSize',10);
    else
        set(AX(1),'YTickLabel',{}) % N'affiche pas les 'labels' sur l'axe des ordonnées, que les 'Ticks'
    end
     
    set(AX(1),'XLim',[0 5],'XTick',0:1:5,'XTickLabel',0:1:5, 'fontsize', 9);
    set(AX(2),'XLim',[0 5],'XTick',0:1:5, 'XTickLabel', {});
    if c==4 || c==5 || c==6 || c==10 || c==11 || c==12
       xlabel(AX(1),'Abscisse','color','k','FontSize',10);
       xlabel(AX(2),{});
    end
     
        set(AX(2),'YDir','reverse');
        set(AX(2),'YLim',[0 10],'ytick',0:2:10)
     
     
        set(H2,'FaceColor','b','EdgeColor','b');
        box(AX(1),'off');
     
        if c==3 || c==6 || c==9 || c==12 % N'affiche le titre de l'axe des ordonnées que pour le dernier épisode de chaque ligne
            set(AX(2),'YTickLabel',sprintf('%.0f|',0:2:10),'FontSize',8)
            ylabel(AX(2),'Ordonnee2','color','b','FontSize',10);
        else
            set(AX(2),'YTickLabel',{}) % N'affiche pas les 'labels' sur l'axe des ordonnées, que les 'Ticks'
        end
    end

    J'ai essayer de condenser au maximum le code pour en laisser que la mise en forme, je me doute qu'il doit y avoir un soucis avec l'utilisation de hold on (appel au mauvais moment, ne s'applique pas à axe,etc.) ou quelque chose de plus profond mais je galère pour trouver et comme le traçage d'une seule série est OK je suis perdu...

    Si quelqu'un peut m'aider, ce serait top !

    Bonne journée.

    PS: une petite illustration pour faire passer le pavé de code... vraiment désolé d'ailleurs...


  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 : 52 882
    Points
    52 882
    Par défaut
    A mon avis, il faut revoir la conception du code.

    Je séparerais proprement la préparation des données de leur affichage avec plotyy

    En gros, plutôt que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for n = 1 ...
     
        x = rand(1,5);
        y1 = rand(1,5);
        y2 = rand(1,5);
     
        hold on
     
        plotyy(x, y1, x, y2)
     
    end
    Faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    x = [];
    y1 = [];
    y2 = [];
     
    for n = 1 ...
     
        x = [x ; rand(1,5)];
        y1 = [y1 ; rand(1,5)];
        y2 = [y2 ; rand(1,5)];
     
    end
     
    plotyy(x, y1, x, y2)
    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
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2013
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Re,

    Effectivement en prenant le problème dans ce sens ça fonctionne et c'est je pense beaucoup plus rapide à l’exécution car on évite la répétition de la mise en forme des axes à chaque tour...

    Encore fallait-il y penser -> Merci beaucoup pour l'aide apportée.

    Au cas où ça servirait à quelqu'un j'ai corrigé et un peu plus annoté le code pour le rendre un peu plus compréhensible:

    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
     
    figure;
    NbEpisodes=12; % Nb d'événements à tracer
    NbBestCompro=5; % Nb de simulations effectuées pour chaque événement
    NbSubplot=1; % Initialisation du compteur
     
    mBot=0.02; % marge de position des axes par rapport au bas de la figure
    mTop=0.03; % marge de position des axes par rapport au haut de la figure
    mSides=0.05; % marge de position des axes par rapport aux côtés de la figure
    mInterVerti=0.02; % marge séparant deux sous figures côtes à côtes
    mInterHori=0.08; % marge séparant deux sous figures une au dessus de l'autre
    nbColSubplots=3; % Nb de sous figures sur une ligne
    nbLignesSubplots=2; % Nb de sous figures sur une colonne
    wLeg=0.1; % largeur de la partie légende
    wFig= (1 - mSides*2 - mInterVerti*(nbColSubplots-1) - wLeg)/nbColSubplots ; % Calcule la largeur max possible pour chaque subplot
    eFig= (1-0.06*nbLignesSubplots - mTop - mBot - mInterHori*(nbLignesSubplots-1))/nbLignesSubplots ; % Calcule la hauteur max possible pour chaque subplot
     
    Sub_Var=cell(1,NbEpisodes); % Tableau de cellules qui va recevoir l'ensemble des 'handles' des subplots
     
    c=0;
    for ligne=1:NbEpisodes/6 % permet d'avoir 2 lignes sur les figures
        for colo=1:NbEpisodes/4 % permet d'avoir 3 colonnes sur les figures
            c=c+1;
            Sub_Var{NbSubplot}=axes('Position', [mSides+(colo-1)*wFig+(colo-1)*mInterVerti ,mBot+(nbLignesSubplots-ligne)*eFig+(nbLignesSubplots-ligne+1)*mInterHori , wFig , eFig] , 'Units', 'Normalized'); % Positionne le subplot pour l'épisode en cours
            o1=rand(1,4)'; o2=rand(1,4)'; o3=rand(1,4)';
     
            X=1:4; % Série des abscisses
            Y1=zeros(length(o1),(NbBestCompro+1)*3); % Crée la matrice qui reçoit les observations (3 zones observées) et les 'NbBestCompro' simulations.
            Y1(:,1:3)=[o1, o2, o3]; % 3 premières colonnes -> Jeux de valeurs qui jouent le rôle des observations
            Y2=rand(1,4)'*2; % Jeux qui jour le rôle des précipitations ou autre variable d'entrée du système qui sera tracée sur l'axe secondaire
     
            for z2=1:NbBestCompro % Création de jeux de paramètres "simulés" pas trop éloignés des séries observées (o1 à o3).
                s1=o1+rand()/10;
                s2=o2+rand()/10;
                s3=zeros(4,1);
                for i=1:4
                    if o3(i)-rand()/10<0 % Pour éviter d'avoir des valeurs négatives
                       s3(i)=0;
                    else
                       s3(i)=o3(i)-rand()/10;
                    end
                end   
                Y1(:,3*z2+1:3*(z2+1))=[s1, s2, s3]; 
            end
     
            [H1, H2]=TracePlot(c, NbBestCompro, X, Y1, Y2);
            NbSubplot=NbSubplot+1;
         end
    end
     
    LegPos=axes('Position', [0.85 0.1 0.12 0.5], 'Units', 'Normalized'); 
    axis off
    h=legend(LegPos,[H1(1:3);H1(length(H1)-2:length(H1));H2],'Obs-1','Obs-2','Obs-3','Sim-1','Sim-2','Sim-3','Rain');
    set(h,'color','w', 'fontsize',10);
    Et la partie traçage et mise en forme des axes, séries tracées etc. (TracePlot):

    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
    function [H1, H2]=TracePlot(c,iteMax,X,Y1,Y2)
     
    [AX,H1,H2]=plotyy(X,Y1,X,Y2,'plot','bar');
     
    title(strcat({'Episode: '},{int2str(c)}), 'FontSize',10,'FontWeight','bold');
    set(AX,{'ycolor'},{'k';'b'})
     
    set(H1(1),'color',[0 0 0],'LineStyle','o','markersize',3);
    set(H1(2),'color',[0.0 0.6 0.3],'LineStyle','s','markersize',3);
    set(H1(3),'color',[0.8 0.3 0.6],'LineStyle','^','markersize',3);
     
    for i=4:3:3*iteMax % Mise en forme coucleurs faibles pour les premières simulations
            set(H1(i),'color',[0.7 0.7 0.7],'LineStyle','-');
            set(H1(i+1),'color',[0.5 0.9 0.4],'LineStyle','-');
            set(H1(i+2),'color',[1.0 0.6 0.8],'LineStyle','-');
    end
    % Mise en forme plus foncée pour la dernière série de simulations
    set(H1(3*iteMax+1),'color',[0 0 0],'LineStyle','-');
    set(H1(3*iteMax+2),'color',[0.0 0.6 0.3],'LineStyle','-');
    set(H1(3*iteMax+3),'color',[0.8 0.3 0.6],'LineStyle','-');
     
     
    set(AX(1),'YLim',[0 1.5],'YTick',0:0.5:5);
    if c==1 || c==4 || c==7 || c==10 % N'affiche le titre de l'axe des ordonnées que pour le premier épisode de chaque ligne
        set(AX(1),'YTickLabel',sprintf('%.2f|',0:0.5:5),'FontSize',8)
        ylabel('Ordonnee1','color','k','FontSize',10);
    else
        set(AX(1),'YTickLabel',{}) % N'affiche pas les 'labels' sur l'axe des ordonnées, que les 'Ticks'
    end
     
    set(AX(1),'XLim',[0 5],'XTick',0:1:5,'XTickLabel',0:1:5, 'fontsize', 9);
    set(AX(2),'XLim',[0 5],'XTick',0:1:5, 'XTickLabel', {});
    if c==4 || c==5 || c==6 || c==10 || c==11 || c==12
       xlabel(AX(1),'Abscisse','color','k','FontSize',10);
       xlabel(AX(2),{});
    end
     
        set(AX(2),'YDir','reverse');
        set(AX(2),'YLim',[0 10],'ytick',0:2:10)
     
     
        set(H2,'FaceColor','b','EdgeColor','b');
        box(AX(1),'off');
     
        if c==3 || c==6 || c==9 || c==12 % N'affiche le titre de l'axe des ordonnées que pour le dernier épisode de chaque ligne
            set(AX(2),'YTickLabel',sprintf('%.0f|',0:2:10),'FontSize',8)
            ylabel(AX(2),'Ordonnee2','color','b','FontSize',10);
        else
            set(AX(2),'YTickLabel',{}) % N'affiche pas les 'labels' sur l'axe des ordonnées, que les 'Ticks'
        end
    end
    Merci encore DUT !


    La figure corrigée:

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

Discussions similaires

  1. [XL-2010] Boucle For qui ne fonctionne pas pour toutes les valeurs
    Par pleskyd dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 13/02/2012, 15h16
  2. Réponses: 3
    Dernier message: 30/06/2009, 14h07
  3. .bat qui ne marche pas sur tout les postes
    Par guismoman33 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 06/08/2008, 11h52
  4. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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