function handleAP=plotMultiAxes(AxesPrincipaux,AxesSecondaires) %plotMultiAxes trace des graphiques à plusieurs axes x et y % handleAP=plotMultiAxes(AxesPrincipaux,AxesSecondaires) % est une fonction qui permet de tracer % un vecteur AxesPrincipaux.y % en fonction de AxesPrincipaux.x % mais aussi en fonction d'autres % axes : AxesSecondaires.Vecteur. % % Les vecteurs AxesPrincipaux.y, % AxesPrincipaux.x et AxesSecondaires(i).Vecteur % sont de même dimensions et % leurs données se correspondent. % % Exemple de 2ème axe x % % ^ y ^ % l | | % a | | % b | | h % e |--------------> x2 | ^ % l | labelx2 | | D/100*h % y | | | % |--------------> x1 v v % labelx1 % % L'axe secondaire (i) peut être un axe des % abscisses (AxesSecondaires(i).Nature=1) % ou bien un axe des ordonnées % (AxesSecondaires(i).Nature=2). % % L'axe secondaire x (ou y) est dessiné % à une certaine distance de l'axe principal x (ou y), % spécifiée par l'utilisateur en pourcentage % de la hauteur (ou largeur) de la feuille % graphique : AxesSecondaires(i).Distance. % Cette valeur est comprise entre 0 et 100. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Auteur: Elodie Roux (www.elodieroux.com) % Date : Octobre 2001 %%%%%%%%%%%%%%%%%%% ENTREES : %%%%%%%%%%%%%%%%%%%%%%%% %- Axes Principaux AP % Entrées obligatoires : % AP.x =[Données du Vecteur x à tracer]; % AP.y =[Données du Vecteur y à tracer y=y(x)]; % % Entrées facultatives : (valeurs par défaut) % AP.Labelx =' '; % Label de l'axe des abscisses % AP.Labely =' '; % Label de l'axe des ordonnées % AP.Titre =' '; % Titre du graphique % AP.Color ='b'; % Couleur du trait de la courbe % AP.LineStyle ='-'; % Style du trait de la courbe % AP.LineWidth =[0.5]; % Épaisseur du trait de la courbe % AP.Marker ='none'; % Marqueurs (+ . o ^ v ou bien x) % AP.MarkerSize =6; % Taille des marqueurs % AP.MarkerEdgeColor ='auto'; % Couleur du contour % AP.MarkerFaceColor ='none'; % Couleur de remplissage % AP.Axis =[]; % Bornes du trace du graphique % %- Axes Secondaires AS % Entrées obligatoires : % AS.Vecteur =[Données correspondantes à AP.x ou AP.y]; % AS.Nature =1 ou 2; %axe x ou y ? % % Entrées facultatives : (valeurs par défaut) % AS.Distance =15; %position axe en % de hauteur du graph % AS.Format =2; %graduation? 1=linéaire, 2=automatique % AS.Label =' '; % %%%%%%%%%%%%%%%%%%% SORTIE : %%%%%%%%%%%%%%%%%%%%%%%% % La fonction renvoie le 'handle' h de % h=plot(AP.x,AP.y) de manière à ce que % l'utilisateur puisse modifier librement les % propriétés du graphique par la suite. % Exemple : % get(h) % Affiche les propriétés % set(h,'Color','r') % Modifie la couleur (rouge) de la courbe % % NB : il est conseille de ne pas changer axis % par la suite (sous peine d'avoir les axes % secondaires inadaptés). Spécifiez-le des le départ % avec AP.Axis=... % Exemple : % ne pas faire : plotMultiAxes(AP,AS), axis([xmin xmax ymin ymax]) % mais faire : AP.Axis=[xmin xmax ymin ymax], plotMultiAxes(AP,AS) % % NB2 : Cela permet aussi de créer un axe secondaire % non superpose a la courbe. % Exemple : % plot(x,y) % Les axes x et y sont adaptée a la courbe % t=axis; % ce sont les bornes des axes principaux % adaptées au trace de la courbe. % t est de la forme [xmin xmax ymin ymax] % Pour créer un axe secondaire x non superpose, % décalez ces bornes par : % AP.Axis=[xmin xmax ymin-L ymax]; % AS.Distance=Lpourcent % avec Lpourcent/100*(ymax-(ymin-L))100 | AS(i).Distance<0)==1 % erreur disp(' ') disp(['AxesSecondaires(' num2str(i) ').Distance doit']) disp(['être compris entre 0 et 100']) disp(['Vous avez peut-etre aussi considere trop d''axes']) disp(['sans en preciser leur distance.']) error(['Erreur dans la structure d''entrée des Axes Secondaires']) end if(isempty(eval('AxesSecondaires(i).Format','[]'))==1) AS(i).Format = DefaultAS.Format; else AS(i).Format = AxesSecondaires(i).Format; if(AS(i).Format==1 | AS(i).Format==2)~=1 disp(' ') disp(['AxesSecondaires(' num2str(i) ').Format doit être = à :']) disp([' 1 : graduation linéaire (correspond à l''axe principal)']) disp([' 2 : graduation automatique (adaptée)']) error(['Erreur dans la structure d''entrée des Axes Secondaires']) end end if(isempty(eval('AxesSecondaires(i).Label','[]'))==1) AS(i).Label = DefaultAS.Label; else AS(i).Label = AxesSecondaires(i).Label; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Réalisation des Axes secondaires %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if(AS(i).Nature==1) %axe abscise %______ Tracé de l'axe secondaire (trait) ______ D=(ymax-ymin)*AS(i).Distance/100; patch([xmin xmax],[ymin+D ymin+D],'k'); %_________ Label de l'axe secondaire AS ________ % Calcul de la position du label de l'AS % On laisse faire à matlab le calcul % de la position idéale % (centrage du texte,...). % Il n'y aura plus qu'à rectifier le % positionnement en y tampon=xlabel(AS(i).Label); tampon2=get(tampon,'Position'); text(tampon2(1),tampon2(2)+D,AS(i).Label,... 'HorizontalAlignment','center',... 'VerticalAlignment','top') clear tampon %_________ Graduation de l'axe secondaire ______ %Valeurs et position des Xtick: %------------------------------ % Valeurs : Chiffres qui seront écrits % sur l'axe secondaire % Valeurs -> XtickASLabel % Position : Où écrire les Valeurs % càd les abscisses x % dans la base Axe Principaux % où les Valeurs des XtickAS % devront être écrites. % Position -> XtickAS if(AS(i).Format==1) % graduation linéaire % Calcul des Xtick de l'axe secondaire AS XtickASLabel=interp1(AP.x,AS(i).Vecteur,XtickAP); XtickAS=XtickAP; end % end de "if(AS(i).Format==1)" if(AS(i).Format==2) % graduation automatique % Calcul automatique de Matlab % des valeurs XtickAS idéaux (labels) % lors du tracé y en fonction de l'AS figure(2) tampon=plot(AS(i).Vecteur,AP.y); tamponParent=get(tampon,'Parent'); % Récupération des labels (valeurs) % idéaux de ces XtickAS XtickASLabel=get(tamponParent,'XTick'); close 2 % Calcul des XtickAS (position) % càd position en x (base Axe Principaux) % des labels des XtickAS XtickAS=interp1(AS(i).Vecteur,AP.x,XtickASLabel); end % end de "if(AS(i).Format==2)" %______ Tracé des traits des XtickAS _______ gcf; text(XtickAS,repmat(ymin+D,size(XtickAS)),'l',... 'HorizontalAlignment','left',... 'VerticalAlignment','middle') %______ Écriture des valeur des XtickAS _____ decalage=abs(tampon2(2)-ymin)/4; text(XtickAS,repmat(ymin+D-decalage,size(XtickAS)),... [num2str(XtickASLabel','%0.3g')],... 'HorizontalAlignment','center',... 'VerticalAlignment','top') %_____ Fin du tracé de l'axe secondaire_____ elseif(AS(i).Nature==2) %axe ordonnées %____ Tracé de l'axe secondaire (trait) ____ D=(xmax-xmin)*AS(i).Distance/100; patch([xmin+D xmin+D],[ymin ymax],'k'); %_______ Label de l'axe secondaire AS ______ % Calcul de la position du label de l'AS. % On laisse faire à matlab le calcul % de la position idéale % (centrage du texte,...) % il n'y aura plus qu'à rectifier le % positionnement en x tampon=ylabel(AS(i).Label); tampon2=get(tampon,'Position'); hlabelAS=text(tampon2(1)+D,tampon2(2),AS(i).Label,... 'Rotation',90,... 'HorizontalAlignment','center',... 'VerticalAlignment','bottom'); clear tampon %_________ Graduation de l'axe secondaire ______ %Valeurs et position des Ytick: %------------------------------ % Valeurs : Chiffres qui seront écrits % sur l'axe secondaire % Valeurs -> YtickASLabel % Position : Où écrire les Valeurs % càd les ordonnées y % dans la base Axe Principaux % où les Valeurs des YtickAS % devront être écrites. % Position -> YtickAS if(AS(i).Format==1) % graduation linéaire % Calcul des Ytick de l'axe secondaire AS %YtickASLabel=interp1(AP.y,AS(i).Vecteur,YtickAP); % Un tri par ordre croissant de varx % s'impose pour utiliser la fonction matlab : % Yàinterpoler=interp1(varx,vary,Xconnus) [varx,I]=sort(AP.y); vary=AS(i).Vecteur(I); YtickASLabel=interp1(varx,vary,YtickAP); YtickAS=YtickAP; end % end de "if(AS(i).Format==1)" if(AS(i).Format==2) % graduation automatique % Calcul automatique de Matlab % des valeurs YtickAS idéaux (labels) % lors du tracé y en fonction de l'AS figure(2) tampon=plot(AP.x,AS(i).Vecteur); tamponParent=get(tampon,'Parent'); % Récupération des labels (valeurs) % idéaux de ces YtickAS YtickASLabel=get(tamponParent,'YTick'); close 2 % Calcul des YtickAS (position) % càd position en y (base Axe Principaux) % des labels des YtickAS %YtickAS=interp1(AS(i).Vecteur,AP.y,YtickASLabel); % Un tri par ordre croissant de varx % s'impose pour utiliser la fonction matlab : % Yàinterpoler=interp1(varx,vary,Xconnus) [varx,I]=sort(AS(i).Vecteur); vary=AP.y(I); YtickAS=interp1(varx,vary,YtickASLabel); end % end de "if(AS(i).Format==2)" %______ Tracé des traits des YtickAS _______ gcf; text(repmat(xmin+D,size(YtickAS)),YtickAS,'-',... 'HorizontalAlignment','left',... 'VerticalAlignment','middle') %______ Écriture des valeur des YtickAS _____ decalage=abs(tampon2(1)-xmin)/4; r=text(repmat(xmin+D-decalage,size(YtickAS)),YtickAS,... [num2str(YtickASLabel','%0.3g')],... 'HorizontalAlignment','right',... 'VerticalAlignment','middle'); ExtentionLabel=get(r,'Extent'); ExtentionLabel=cat(1,ExtentionLabel{:}); Labelmax=max(ExtentionLabel(:,3)); %if(D-xmin