Plot di diversi canali (da 1 ad un max di 8 a scelta)

di il
1 risposte

Plot di diversi canali (da 1 ad un max di 8 a scelta)

Ciao a tutti, sto lavorando su una GUI ed ho un problema nel plotter diversi segnali uno sopra l'altro sulla stessa finestra. So che si può fare con subplot ma per il mio caso non va bene, in quanto l'utente può selezionare i canali da visualizzare (da 1 a . Come faccio a fare in modo che sia possibile sceglierne e visualizzarne da 1 a 8?

1 Risposte

  • Re: Plot di diversi canali (da 1 ad un max di 8 a scelta)

    La domanda è "un po' vecchia", ma forse la risposta può essere utile a qualcuno.

    Una possibilità per selezionare in modo dinamico i canali da rappresentare graficamente potrebbe essere:

    [*] creare una listbox nella quale inserire gli identificativi dei possibili elementi (canali) che l'utente può selezionare.
    La "listbox" deve essere creata in modo da consentire la "selezione multipla"
    [*] creare tanti "subplot" quanti sono i possibili elementi (nel caso specifico della domanda, otto)
    [*] creare un "pushbutton" che attivi il plot degli elementi selezionati

    La GUI può poi essere ulteriormente dotata di funzionalità aggiuntive per, esempio, la cancellazione dei singoli grafici oppure di tutti.

    Una alternativa potrebbe consistere nel creare solo il numero di "subplot" necessari al plot degli elementi selezionati.

    Gli script che seguono implementano il primo approccio (creazione di tutti i "subplot" contemporaneamente.
    La GUI che viene creata è molto semplice (poco "professionale"), ma il suo scopo è solo quello di mostrare "il concetto".

    Nello script i segnali da plottare sono definiti come semplici valori di funzioni (calcolati nel "main script), se la GUI oggetto della domanda deve rappresentare segnali acquisiti da una fonte esterna, gli script devono essere opportunamente modificati.

    Main script per la creazione della GUI
    
    %
    % Generazione dati di esempio
    %
    x=0:.1:2*pi;
    y=[];
    y(1,:)=sin(x);
    y(2,:)=sin(2*x);
    y(3,:)=sin(3*x);
    y(4,:)=sin(4*x);
    y(5,:)=sin(5*x);
    y(6,:)=sin(6*x);
    y(7,:)=sin(7*x);
    y(8,:)=sin(8*x);
    %
    % Creazione "figura"
    %
    fig_h=figure;
    % 
    % Inizializzazione vettore per memorizzazione handle dei vari grafici
    % 
    plt_h=zeros(1,8);
    % 
    % Loop creazione 8 assi cartesiani (8 subplot) e relativo pushbutton per
    % cancellazione grafico. La callback per la cancellazione del singolo
    % grafico è definita direttamente all'interno della funzione "uicontrol"
    % 
    for i=1:8
       ax_list(i)=subplot(8,1,i);
       grid on
       tmp_pos=get(ax_list(i),'position');
       set(ax_list(i),'position',[.43 tmp_pos(2) .47 tmp_pos(4)], ...
          'fontsize',6,'fontweight','bold');
       %
       % Creazione Clear CH PUSHBUTTON
       %
       c_pb_h(i)=uicontrol('style','pushbutton', ...
          'unit','normalized', ...
          'position',[.90 tmp_pos(2) .1 .05], ...
          'enable','off', ...
          'tag',['clear_pb_' num2str(i)], ...
          'callback',['delete(plt_h(' num2str(i) '));set(c_pb_h(' num2str(i) '),''enable'',''off'');plt_h(' num2str(i) ')=0.0;'], ...
          'string','Clear');
       
    end
    %
    % Creazione LIST BOX: alla listbox non è associata nessuna callback
    %
    lb_h=uicontrol('style','listbox', ...
       'unit','normalized', ...
       'position',[.07 .6 .3 .3], ...
       'max', 8, ...
       'callback','');
    %
    % Creazione Plot Selected CH pushbutton; la callback è definita nel file
    % "plot_sel_ch.m" ed attiva il plot dei grafici selezionati nella listbox
    %
    p_pb_h=uicontrol('style','pushbutton', ...
       'unit','normalized', ...
       'position',[.07 .3 .2 .05], ...
       'callback', 'plot_sel_ch', ...
       'string','Plot Selected CH');
    %
    % Creazione Clear All pushbutton; la callback è definita nel file
    % "clear_all_ch.m" e cancella tutti i grafici
    %
    c_all_pb_h=uicontrol('style','pushbutton', ...
       'unit','normalized', ...
       'position',[.07 .2 .2 .05], ...
       'callback','clear_all_ch', ...
       'enable','off', ...
       'string','Clear All');
    %
    % Creazione della lista contenente gli elementi che possono essere plottati
    %
    lista{1}='sin(x)';
    lista{2}='sin(2*x)';
    lista{3}='sin(3*x)';
    lista{4}='sin(4*x)';
    lista{5}='sin(5*x)';
    lista{6}='sin(6*x)';
    lista{7}='sin(7*x)';
    lista{8}='sin(8*x)';
    %
    % Assegnazione della lista alla LIST BOX
    %
    set(lb_h,'string',lista)
    
    Script della callback "clear_all_ch"
    % 
    % Callback "clear_all_ch" associata al pushbutton creato nello script
    % "multi_canale.m". Loop su tutti i "subplot" per la cancellazione dei
    % grafici I pushbutton per la cancellazione dei singoli grafici e quello
    % per la cancellazione di tutti i grafici vengono disabilitati
    % 
    for i=1:8
    % 
    %    Individuazione della presenza di un grafico nell'i-esimo asse
    %    (l'handle viene assegnato in "plot_sel_ch"
    %    
       if(plt_h(i) ~= 0)
    %       
    %       Cancellazione del grafico
    %       
          delete(plt_h(i));
    %       
    %       Disabilitazione dei pushbuttons per la cancellazione dei singoli
    %       grafici e di quello per la cancellazione di tutti i grafici
    %       
          set(c_pb_h(i),'enable','off');
          set(c_all_pb_h,'enable','off');
          plt_h(i)=0;
       end
    end
    
    Script della callback "plot_sel_ch
    % Callback "plot_sel_ch" associata al pushbutton creato nello script
    % "multi_canale.m"
    %
    % Indentificazione degli elementi selezionati nella listbox
    % 
    sel_ch=get(lb_h,'value');
    % 
    % Loop sugli elementi selezionati nella listbox
    % 
    for i=1:length(sel_ch)
       curr_ch=sel_ch(i);
    %    
    %    Selezione dell'asse cartesiano corrispondente all'elemento selezionato
    %    e plot della funzione
    %    
       axes(ax_list(curr_ch))
       plt_h(curr_ch)=plot(x,y(curr_ch,:));
       set(gca,'fontsize',6,'fontweight','bold');
       grid on
    % 
    %    Abilitazione del pushbutton per la canccellazione del garfico e di
    %    quello per la cancellazione di tutti i grafici
    % 
       set(c_pb_h(curr_ch),'enable','on');
       set(c_all_pb_h,'enable','on')
    end
    
    Hope this helps.
    Allegati:
    16082_329fa079d5ee980ccd1d4f4893a42d90.jpg
    16082_329fa079d5ee980ccd1d4f4893a42d90.jpg
Devi accedere o registrarti per scrivere nel forum
1 risposte