Hello les gens

Alors voilà, suite à un problème récurrent dans les plots de différentes figure, je voulais avoir un zoom qui lorsque je zoom sur la figure 1 applique un même zoom sur la figure 2 par exemple : en faite toujours avoir sur la figure 1 et 2 les mêmes limites en X (propriété XLim).

Ceci est particulièrement utiles lorsque vous ne voulez pas superposer sur le même graphes trop de courbes, vous faites alors plusieurs figure. Par contre pour comparer les valeurs pour une même abscisse, si les zoom ne sont pas coordonnées, c'est assez difficile.

Bref, je sais pas si je suis clair.

Donc j'ai développé la fonction suivante (fonctionne uniquement à partir de 2006b) :

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
73
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Fichier : my_autozoom.m                                                 %
% Version : 0.1                                                           %
% Date    : 18 juillet 2008                                               %
% Auteur  : LordPeterPan2                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% SYNTHAXE :                                                              %
% >>  my_autozoom(vect_fig)                                               %
% vect_fig : vecteur d'entiers                                            %
% Chaques figures contenue dans vect_fig sont liées désormais du point de %
% vu zoom en X.                                                           %
% EXEMPLE :                                                               %
% >>  my_autozoom([ 1 6 10])                                              %
% Chaque fois qu'un zoom est effectué sur une des figures 1, 6 ou 10, les %
% autres figure subit le même zoom en X.                                  %
% RESTRICTION :                                                           %
% $ Une fois qu'une figure est fermée, cette figure n'est plus liée aux   %
% autres figures, même si celle-ci est recrée                             %
% $ En reprenant l'exemple ci-dessus, si vous faite un zoom sur la figure %
% 1 les figure 6 et 10 sont affecté de ce même zoom en X. Si vous voulez  %
% revenir au zoom initial, il faut imperativement le faire depuis la      %
% figure 1 (si vous voulez dézoomer depuis la figure 6 ou 10 celà n'aura  %
% aucun effet)                                                            %
% $ Si vous cliquer sur l'icone de la loupe pour désactivé le zoom celà   %
% produit une erreur (l'auteur ne sais pas pourquoi ??)                   %
% $ Pour fonctionner, la fonction crée la variable FIGURE_LINK dans le WS %
% de base, si cette dernière est supprimée, le programme peut réagir      %
% bizarrement                                                             %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
function my_autozoom(vect_fig)
 
if (min(size(vect_fig))>1)
    error('my_autozoom(vect_fig) : vect_fig must be a vector, not a matrix');
end;
 
try
    FIGURE_LINK = evalin('base','FIGURE_LINK') ;
end;
 
FIGURE_LINK(vect_fig,vect_fig) = 1 ;
assignin('base','FIGURE_LINK',FIGURE_LINK);
 
for ind_fig = vect_fig
    figure(ind_fig);
    set(ind_fig,'CloseRequestFcn',@Fct_CloseRequestFcn) ;
    h=zoom;
    set(h,'ActionPostCallback',@Fct_PostCallBack);
end;
 
function Fct_CloseRequestFcn(obj,evt)
try
    FIGURE_LINK = evalin('base','FIGURE_LINK') ;
end;
 
FIGURE_LINK(obj,:  ) = 0 ;
FIGURE_LINK(:  ,obj) = 0 ;
assignin('base','FIGURE_LINK',FIGURE_LINK);
delete(obj);
 
function Fct_PostCallBack(obj,evd)
 
if evalin('base','exist(''FIGURE_LINK'',''var'')')
    newLim = get(evd.Axes,'XLim');
 
    FIGURE_LINK = evalin('base','FIGURE_LINK');
    all_fig = find(FIGURE_LINK(get(evd.Axes,'Parent'),:)) ;
 
    for ind_fig = all_fig
        set(get(ind_fig,'CurrentAxes'),'Xlim',newLim);
    end;
end;
Je suis globalement satisfait de ma fonction sauf que j'ai des limitations qui m'embête :

Si je lie les zoom des figure 1 et 2 via :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
for ind_plot=1:N
  figure;
  plot(1:100,rand(1,100));
end;
my_autozoom([1 2]);
si je zoom sur la figure 1 la figure 2 est également zoomé. Mais si je double clique sur la figure 2 pour revoir le zoom initial cela ne marche pas, il faut que je revienne sur la figure 1 et que je double clique : c'est pas naturelle du tout et lorsque l'on a un tas de figure, il faut alors se rappeler sur quel figure on a zoomé la première fois pour tout dézoomer :o

De plus si sur une figure j'ai des subplots, alors je n'arrive pas à lier les zoom des subplots d'une même figure

Enfin j'ai un dernier problème. Le fonctionnement voulue ne marche que si la variable globale FIGURE_LINK n'est pas effacée. Ce que je voudrais c'est que la variable ne soit connu que dans les fonction my_autozoom, Fct_CloseRequestFcn et Fct_PostCallBack. Si je déclare la variable comme PERSISTENT dans my_autozoom, alors elle n'est pas connu dans les deux autres fonctions

Merci d'avance.