Grafici finali di un loop

di il
4 risposte

Grafici finali di un loop

Buongiorno a tutti, chiedo scusa se chiedo ancora una volta, ma sono alle prime armi con matlab e per "sopravvivenza" devo obbligatoriamente delle cose.
Nel programma a cui sto lavorando, vengono effettuate delle analisi, tra cui il programma:

1. Mi calcola il residuo (differenza tra funzione fitting e dati) che viene graficato insieme ai dati e alla funzione fitting
2. Mi calcola R2
3. Mi calcola un certo numero Xsp2

Io ora ho impostato che il programma mi salva su un file i valori ENERGIA- RESIDUO (sono 1024 coppie di valori) per ogni analisi, su un altro file mi salva le coppie R2-Xsp2 (una sola coppia a ogni analisi).

Il programma ha un ciclo while per permettere di fare più analisi e
1. per quanto riguarda il file ENERGIA- RESIDUO a ogni ciclo l'utente deve dare il nome del file (quindi si crea un file a ogni ciclo),
2. per quanto riguarda il file R2-Xsp2 (essendo una sola coppia di valori), si inserisce il nome del file solo la prima volta e poi a ogni ciclo il programma aggiunge le coppie a quel file.

Ora vorrei fare un'altra cosa e cioè alla fine dei cicli (Cioè quando l'utente clicca su FINE) vorrei creare 2 grafici:

1. il grafico ENERGIA-RESIDUO di TUTTI i files analizzati, quindi in pratica mi servirebbe che a ogni ciclo (Di cui non conosco il numero, potrebbe essere un'analisi di un solo file o di 10 files, o di 20 files...dipende dall'utente) si crea un vettore energia - residuo e alla fine vengono plottati tutti sullo stesso grafico, ovviamente permettendo di capire di quale set dati si tratta, ad esempio cambiando colore o tipo della linea e specificarlo in una legenda (Sottolineo che l'energia è sempre la stessa, a cambiare è solo il residuo);

2. Il grafico R2-Xsp2 in cui vengono riportati tutti i punti (similmente al grafico Energia- residuo) e inoltre si fa un fit lineare ai punti.


Ps. Io questi vettori li ho già creati per scriverne i valori su file e cioè:

1. Per ENERGIA-RESIDUO
 Residuo=[xdata; ydata - A.*ckgraconv_n-lambda.*ckdian];
2. Per R2-Xsp2
Matsp2e=[R2; sp2e];
Però dovrei avere per ogni i-esima analisi un vettore Residuo(i) e un vettore Matsp2e (i) e poi nella legenda far capire a chi mi riferisco. Per far capire a chi si riferisce, nella legenda, vorrei scrivere il nome del materiale (Nome che già faccio scrivere all'utente e mi stampo su un file log dove ci sono tutta a una serie di dati sia di input che output)

cioè:
fprintf('\n Inserire il nome del materiale che si sta analizzando tra due apici es: ''Nome materiale''\n');
   nomespetanal=input('Nome: ');
E' possibile una cosa del genere?
Grazie anticipatamente
-------------------------------------------EDIT-------------------------------
Io ho provato a fare così:

1. Per il grafico ENERGIA-RESIDUO all'interno del programma ho fatto:

figure(3); hold on
title('Energia- Residuo');
  axis([ xminas   xmaxas  yminas  ymaxas])
plot(xdata,ydata - A.*ckgraconv_n-lambda.*ckdian); %residuo (differenza tra campione e campione fittato)
xlabel('Energia (eV)');
  ylabel('Conteggi relativi')
  legend (nomespetanal);
Mi funziona, cioè a ogni ciclo mi aggiunge un grafico su quella figura, ma ho il problema sulla legenda, cioè la legenda viene "sovrascritta" anzichè aggiungere di volta in volta il nome , quindi ad esempio se faccio 2 cicli, mi trovo correttamente 2 grafici, ma nella legenda mi trovo solo il nome dell'ultimo file analizzato!


2. Per il grafico R2-Xsp2e, siccome, ho il file con tutte le coppie create durante i cicli, avevo provato semplicemente a graficare i dati presenti nel
file (devo ancora aggiungere la funzione di fitting) un attimo prima di chiudere il programma e cioè:

%%%%%%%%%%%%%%%%%%%%%%%% CREO IL GRAFICO R2-Xsp2-FC%%%%%%%%
 s=textscan(f3,'%f %f','headerlines',23)
 xr2xs=s{1};
 yr2xs=s{2}
figure(4); hold on
title('R2-Xsp2');
plot(xr2xs,yr2xs,'b*'); 
xlabel('R2');
  ylabel('Xsp2e')
  legend ('Dati');
%%%%%%%%%%%%%%%%%%%%%%%%END CREO IL GRAFICO R2-Xsp2-FC%%%%%%%%
Purtroppo però non mi funziona

4 Risposte

  • Re: Grafici finali di un loop

    Una risposta veloce (al momento, purtroppo, non ho molto tempo a disposizione).

    Per risolvere il problema relativo alla legenda: dalla porzione di codice che hai pubblicato non si capisce come venga generata la stringa, ad ogni modo ci sono almeno un aio di possibilità:

    [*] inserisci la stringa relativa ad ogni grafico in un "cellarray" che incrementerai ad ogni iterazione ed inserisci la legenda solo al termine del loop; qualcosa del tipo:
    
    % Initialize the legend string
    legend_str={}
    % Loop per il plottaggio
    for i=1:n
       ...                        % some code
       plot(...)                % plot the curve
       legend_str{i}='xxx' % Define the string for the i-th curve
    end
    % Add the legend
    legend(legend_str)
    
    [*] specifica la stringa della legenda in ogni chiamata alla funzione "plot" come illustrato nella documentazione on-line:
    https://it.mathworks.com/help/matlab/ref/legend.html#bu_szh3-1

    Per quanto riguarda la seconda parte (grafico R2-Xsp2e), non è chiaro quale sia il problema: cosa intendi con Purtroppo però non mi funziona?
    Ottieni un messaggi di errore?
    Non ottieni il grafico desiderato? In che modo "non è quello che ti aspetti"?
  • Re: Grafici finali di un loop

    Ciao e grazie.
    Allora
    1. Per il primo grafico (Energia-residuo) ha funzionato facendo come hai detto (cioè creando il vettore legenda) ma ho voluto provare un altro modo (che se funziona dovrebbe essere più comodo) ma purtroppo mi da errore...

    Allora ho fatto così:
    %%%%%%%%%%%%%%%%%%%%%%%%%  CONTATORE E VETTORI INIZIALI-FC %%%%%%%%%%%%%%
       count=1;
       legend_str={};
       residuo_str={};
       energia_str={};
      %%%%%%%%%%%%%%%%%%%%%%%%% END  CONTATORE E VETTORE -FC %%%%%%%%%%%%%%
    .
    .
    .
    .
    .
    %%%%%%%%%%%%%CREO VETTORI PER PLOT RESIDUO -FC%%%%%%%%%%%
      energia_str{count}=xdata; 
       residuo_str{count}=A.*ckgraconv_n-lambda.*ckdian;
      legend_str{count}=nomespetanal;
      %%%%%%%%%%%%%END CREO VETTORI PER PLOT RESIDUO -FC%%%%%%%%%%%
    .
    .
    .
    .
    .
    %%%%%%%%%%%%%%%%%%%%%%%% CREO IL GRAFICO DEL RESIDUO-FC%%%%%%%%
        figure(3); hold on
        title('Energia- Residuo');
        axis([ xminas   xmaxas  yminas  ymaxas])
    plot(energia_str, residuo_str); %residuo (differenza tra campione e campione fittato)
    xlabel('Energia (eV)');
    ylabel('Conteggi relativi');
    legend (legend_str);
    hold off
    %%%%%%%%%%%%%%%%%%%%%%%% END CREO IL GRAFICO DEL RESIDUO-FC%%%%%%%%
    
    Quindi mi crea i vettori con i valori di energia, residuo e legenda a ogni ciclo e poi alla fine (quando l'utente clicca su FINE) dovrebbe farmi il grafico..ma mi da errore...

    Per quanto riguarda la variabile count, è stata inizializzata a 1 all'inzio del programma e poi, se l'utente clicca di ricominciare il programma si incrementa:
    count=count+1
    Purtroppo però come detto mi da errore.



    2. Per quanto riguarda invece il grafico R2-Xsp2 non mi plotta nulla sul grafico e, essendoci la legenda da l'errore che non c'è niente e quindi non può fare la legenda
  • Re: Grafici finali di un loop

    ... dovrebbe farmi il grafico..ma mi da errore...

    Come ti si può aiutare se non pubblichi il messaggio di errore?

    Hai provato ad "debuggare" il codice?

    Stesso discorso per la seconda parte:

    hai provato con il debugger?
    Cosa contengono le variabili che vuoi plottare?
    Viene effettuata correttamente la lettura del file di input?
  • Re: Grafici finali di un loop

    Ciao, grazie. Per il secondo grafico era un problema di caricamento file (ho risolto con load). Per il primo grafico...visto che il primo modo usato funziona, per ora lascio quello...in caso più in là vedrò
Devi accedere o registrarti per scrivere nel forum
4 risposte