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):
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 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);
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...
Partager