Funzione in grado di vedere se c'è una figura aperta

di il
1 risposte

Funzione in grado di vedere se c'è una figura aperta

Ciao a tutti, ho provato a vedere se tra le risposte presenti ci fosse già quella relativa al mio quesito, ma non ho trovato nulla.
Il pezzo di codice per cui devo trovare una soluzione è il seguente:

   rpst = plotstho(ru,rmeanst,rfst,n);
    cpst = plotstho(cu,cmeanst,cfst,n,'hold on');
    for i = 1:gen, rpst{i}.MarkerEdgeColor = 'b'; end
    for i = 1:gen, cpst{i}.MarkerEdgeColor = 'r'; end
    
    
ru, cu, rmeanst, cmeanst sono celle 1xgen (gen è un numero) in cui sono presenti dei vettori
rfst e cfst sono funzioni (@...)
n è un numero

Sostanzialmente plotstho fa un plot in cui mette tutti i dati delle due cell che gli si dà come inputs e se gli si dice 'hold on' (tramite un if che c'è dentro la funzione e che mi conta gli inputs), tiene la figura che c'è già aperta e vi plotta dentro.
Perciò questo pezzo di codice mi plotta ru e rmeanst, poi cu e cmeanst mettendoli sulla stessa figura.
La mia domanda è: non c'è un modo per dirlgi senza input, direttamente dentro plotstho, plotta sulla figura che trovi aperta oppure creane una se non ci sono figure disponibili? Un po' come fa la funzione plot di matlab.

Inoltre, se alla fine, dopo il cambio di colore dei Markers, gli dico di mettere una legenda per i due casi me la fa con lo stesso colore, ma non capisco perché.

Grazie

Ps: è la prima volta che scrivo e ho provato a leggere il regolamento, ma al link mi dice che non esiste.

1 Risposte

  • Re: Funzione in grado di vedere se c'è una figura aperta

    Ci sono diversi modi per "lavorare" in modo dinamico e / o automatico con le Figure; un approccio semplice consiste nel definire gli handle delle Finestre nel momento in cui vengono create ed usare la funzione "findobj" per cercare l'oggetto (nel caso specifico le finestre) e quindi accedervi in modo "automatico".
    Per identificare le finestre si può assegnare loro, ad esempio un nome.
    Nello script che segue vengono illustrati alcuni esempi delle possibilità di "manipolazione" ed accesso alle finestre.
    
    
    %
    % Generazione punti di esempio
    %
    x=0:.01:2*pi;
    y1=sin(x);
    y11=2*cos(3*x);
    y111=2*cos(3*x).*sin(x);
    y2=cos(x);
    y22=2*sin(3*x);
    %
    % Apertura di due Figure con assegnazione dei "nomi":
    %    Figura #1
    %    Figura #2
    % "f1" e "f2" sono gli handles delle due figure
    % i vettori "f1_plot_h" e "f2_plot_h" conterranno gli handle delle curve in
    % esse plottate
    % i contatori "f1_plot_cnt" e "f2_plot_cnt" memorizzeranno il numero di
    % curve plottate in ogni finestra
    % i cell arrays "nome_curve_f1" e "nome_curve_f2" conterranno i nomi delle
    % curve plottate, da usare per la "legenda"
    %
    f1=figure('name','Figura #1','NumberTitle','off');
    f1_plot_h=[];
    f1_plot_cnt=0;
    nome_curve_f1={};
    %
    f2=figure('name','Figura #2','NumberTitle','off');
    f2_plot_h=[];
    f2_plot_cnt=0;
    nome_curve_f2={};
    %
    % Selezione della figura "1" nella quale plottare la curva "y1"
    %
    figure(f1)
    %
    % Incremento del contatore delle curve plottate nella figura 1
    % Plot della curva, memorizzazione del relativo handle, generazione
    % "automatica del nome della curva tramite la funzione "eval" (ad ogni
    % curva viene assegnato come nome "curva_-#_-x' con "x" numero progressivo
    % della curva
    %
    f1_plot_cnt=f1_plot_cnt+1;
    f1_plot_h(f1_plot_cnt)=plot(x,y1,'r','linewidth',2);
    eval(['nome_curve_f1{f1_plot_cnt}=''curva_-#_-' num2str(f1_plot_cnt) ''';']);
    grid on
    %
    % Selezione della figura "2" nella quale plottare la curva "y2"
    %
    figure(f2)
    %
    % Incremento del contatore delle curve plottate nella figura 2
    % Plot della curva e memorizzazione del relativo handle
    %
    f2_plot_cnt=f2_plot_cnt+1;
    f2_plot_h(f2_plot_cnt)=plot(x,y2,'r','linewidth',2);
    eval(['nome_curve_f2{f2_plot_cnt}=''curva_-#_-' num2str(f2_plot_cnt) ''';']);
    grid on
    %
    % Selezionare di nuova la figura "1" per aggiungere la curva "y11"
    %
    figure(f1)
    hold on
    %
    % Incremento del contatore delle curve plottate nella figura 1
    % Plot della curva e memorizzazione del relativo handle
    %
    f1_plot_cnt=f1_plot_cnt+1;
    f1_plot_h(f1_plot_cnt)=plot(x,y11,'b','linewidth',2);
    eval(['nome_curve_f1{f1_plot_cnt}=''curva_-#_-' num2str(f1_plot_cnt) ''';']);
    %
    % Selezionare di nuova la figura "2" per aggiungere la curva "y22"
    %
    figure(f2)
    hold on
    %
    % Incremento del contatore delle curve plottate nella figura 2
    % Plot della curva e memorizzazione del relativo handle
    %
    f2_plot_cnt=f2_plot_cnt+1;
    f2_plot_h(f2_plot_cnt)=plot(x,y22,'b','linewidth',2);
    eval(['nome_curve_f2{f2_plot_cnt}=''curva_-#_-' num2str(f2_plot_cnt) ''';']);
    %
    % La dunzione "findobj" consente di "trovare" gli oggetti, nel caso
    % specifico, vengono cercati quelli di "type" "figure".
    % Nella variabile "list_of_figure" vengono "ritornati" gli handles delle
    % figure aperte
    % Gli handle vengono "ritornati" nell'ordine inverso rispetto alla
    % creazione delle figure (il primo handle ritornato è quello dell'ultima
    % figura aperta
    %
    list_of_figure=findobj('type','figure');
    %
    % La funzione "get" "ritorna" le proprietà dell'oggetto identificato
    % dall'handle in input
    % Nel caso specifico, il "nome" delle figure aperte all'inizio dello script
    % (la variabile "figure_names" è un cell array
    %
    figure_names=get(list_of_figure,'name');
    %
    % Tramite la funzione "findobj" si può anche ottenere direttamente l'handle
    % di una figura.
    % Nel caso specifico, cerchiamo la figura con "name" "Figura #1" l'handle
    % del quale viene assegnato alla varaibile "figure_handle"
    %
    figure_handle=findobj(list_of_figure,'name','Figura #1');
    %
    % Per selezionare una tra le figure aperte, si invoca la funzione "figure"
    % fornenddo in input l'handle della figure stessa che diventa la figura
    % "attiva"
    %
    figure(figure_handle);
    %
    % Il grafico della curva "y111" viene aggiinto (all'inizio dello script è
    % stata attivata la modalità "hold on" per i grafici della "Figura #1"
    %
    %
    % Incremento del contatore delle curve plottate nella figura 1
    % Plot della curva e memorizzazione del relativo handle
    %
    f1_plot_cnt=f1_plot_cnt+1;
    f1_plot_h(f1_plot_cnt)=plot(x,y111,'k','linewidth',2);
    eval(['nome_curve_f1{f1_plot_cnt}=''curva_-#_-' num2str(f1_plot_cnt) ''';']);
    %
    % Esempio di utilizzo dell'handle di una curva per modificarne il colore:
    % il colore della seconda curva plottata nello sviluppo dello script viene
    % cambiato in 'c' ==> azzurro
    %
    set(f1_plot_h(2),'color','c')
    %
    % Inserimento della legenda nelle due figure; alle figure si accede tramite
    % il loro handle
    %
    figure(findobj(list_of_figure,'name','Figura #1'));
    leg_f1=legend(nome_curve_f1);
    figure(findobj(list_of_figure,'name','Figura #2'));
    leg_f2=legend(nome_curve_f2);
    %
    % Modifica del nome della prima curva della seconda figura
    nome_curve_f2{1}='new_-name';
    set(leg_f2,'string',nome_curve_f2)
    
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte