Creare grafico piano cartesiano animato

di il
10 risposte

Creare grafico piano cartesiano animato

Buongiorno,

vorrei sapere come posso creare un grafico animato nel piano (X,Y). Devo plottare due variabili che sono dei vettori.

Allego una foto del grafico che vorrei creare e anche il codice da modificare.


tempo=accelerogramma(:,1);
idx_R = 1; % indice per scegliere R nel grafico
idx_k = 1; % indice per scegliere rapp_nu nel grafico

figure() %plotto lo spostamento nel tempo dell'isolatore Fissato R e il rapporto, variando attrito
hold on
grid on
for i=1:m    %ciclo su nu                   u(gdl,tempo,R,rapp,mu)
    spostamento=u(:,:,idx_R,idx_k,i);
    plot(tempo,spostamento)
    title('Displacement [ibrido]')
    xlabel('time [s]')
    ylabel('D [m]')
%     if times(i,idx_R,idx_k)~=0   % se non supero 0.5 non disegno la linea verticale
%         y=[-0.5 0.5];
%         plot([times(i,idx_R,idx_k) times(i,idx_R,idx_k)],y,'r', 'Linewidth', 0.1)  
%         
%     end
end

10 Risposte

  • Re: Creare grafico piano cartesiano animato

    Nessuno?
  • Re: Creare grafico piano cartesiano animato

    Hai provato a cercare nel forum? Ci sono già delle risposte in merito.
    Prova a dare un'occhiata a questa risposta https://www.iprogrammatori.it/forum-programmazione/matlab-simulink/animazione-plot-matlab-t33819.html#p8593705

    Quello che devi fare è:
    [*] creare un loop nel quale plotti un punto alla volta
    [*] inserire il comando "pause(x)" per "rallentare" il plottaggio ("x" secondi tra il plot di un punto e l'altro)
    [*] se vuoi "conservare" il punti già plottati devi inserire l'istruzione "hold on", se li vuoi cancellare puoi usare la funzione "delete", dopo "la pausa"

    In alternativa potresti anche considerare la funzione "comet" ()
  • Re: Creare grafico piano cartesiano animato

    Non saprei come creare questo loop...e neanche il pause.

    Devo usare sempre il comando plot o un altro?

    Una volta ottenuto questo plot animato, posso salvarlo come .gif?
  • Re: Creare grafico piano cartesiano animato

    Hai dato un'occhiata al codice inserito nella risposta che ho citato nella precedente risposta?

    Hai fatto almeno un tentativo per capire il codice proposto nella risposta citata?
    Dalla rapidità con la quale hai risposto sembrerebbe di no.

    Hai letto le "istruzioni" sul come impostare il loop riportare nella precedente risposta?
    Quale parte delle istruzioni non è chiara?

    Nel codice che segue, sostituisci "x" con i tuoi dati delle ascisse e "y" con quelli delle ordinate.
    
    figure
    axes
    grid on
    hold on
    xlim([min(x) max(x)])
    ylim([min(y) max(y)])
    for i=1:length(x)-1
       plot([x(i) x(i+1)],[y(i) y(i+1)],'-','color','r','linewidth',2);
       pause(.3)
    end
    
    Per quanto riguarda la creazione di una "gif", hai provato a cercare nella documentazione on-line?
    Se cerchi su Google "matlab gif" il primo risultato che viene proposto è quello che fa per te.
  • Re: Creare grafico piano cartesiano animato

    Grazie per la risposta, ho provato a inserire il tuo codice, ma ho notato che inserendo queste righe per un solo grafico, mi va a rendere animati anche tutti gli altri, senza volerlo.
    Allora ho provato a inserire il codice alla fine dello script, ma ogni grafico dove compare una di queste due variabili viene animato.

    Conviene che mi salvo le variabili in un .txt e faccio un file solo per fare questi plot? oppure c'è un modo per evitare questo "errore"?

    Diminuendo il pause ad esempio da 0.1 a 0.000001, aumenta la velocità con la quale i punti sul grafico vengono animati?

    Per quanto riguarda la .gif invece ho provato a crearla, ma non viene "animata", la salvo nella cartella ed aprendola risulta essere una foto normale. Ecco il codice:
    close all
    clear all
    clc
    
    tempo=load('tempo.txt');
    spostamento=load('spostamento.txt');
    
    
    h=figure
    grid on
    hold on
    xlim([min(tempo) max(tempo)])
    ylim([min(spostamento) max(spostamento)])
    for i=1:length(spostamento)-1
       plot([tempo(i) tempo(i+1)],[spostamento(i) spostamento(i+1)],'-','color','b','linewidth',1);
       pause(5/1000000000000)
    end
    
    % Capture the plot as an image 
      frame = getframe(h); 
      im = frame2im(frame); 
      [imind,cm] = rgb2ind(im,256); 
      % Write to the GIF File 
      
      imwrite(imind,cm,'s.gif','gif', 'Loopcount',inf)
      
  • Re: Creare grafico piano cartesiano animato

    Con riferimento alla tua risposta:
    ma ho notato che inserendo queste righe per un solo grafico, mi va a rendere animati anche tutti gli altri, senza volerlo.
    [*] nei post precedenti non hai mai accennato al fatto che ci fosse più di un grafico
    [*] la foto del grafico che hai pubblicato contiene un solo grafico
    [*] come ti si può aiutare se non formuli le domande in modo corretto e, soprattutto, completo?
    Allora ho provato a inserire il codice alla fine dello script, ma ogni grafico dove compare una di queste due variabili viene animato./quote]

    [*] cosa vuol dire "ala fine dello script"?
    [*] devi strutturare il codice che stai scrivendo ed identificare le sequenza delle funzionalità che vuoi implementare. Non puoi semplicemente "spostare" un parte del codice "alla fine" e sperare che funzioni
    Conviene che mi salvo le variabili in un .txt e faccio un file solo per fare questi plot? oppure c'è un modo per evitare questo "errore"?
    [*] se ad un certo "punto" del codice (cioè, ad un certo punto dell'elaborazione) hai a disposizione i dati, non c'è bisogno di salvarli in un file di testo, dovrebbero essere disponibili nelle variabili del codice (vettori, matrici, ...).
    al limite, dovresti cercare di organizzare meglio i dati: nel codice che hai inserito nella prima domanda usi
    u(:,:,idx_R,idx_k,i)
    non mai visto prima utilizzare una matrice con 5 (cinque) dimensioni!

    Non riesco ad immaginare un codice che abbia bisogno di una matrice del genere: prova a semplificare le strutture dati usando variabili più "semplice" e più facilmente gestibili.
    Crea "più" matrici con un numero di dimensioni inferiore.
    Se non altro, dai un'occhiata alla documentazione relativa alla indicizzazione delle variabili

    https://it.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html
    https://it.mathworks.com/help/matlab/learn_matlab/array-indexing.html

    Sai a che porzione di dati corrisponde "u(:,:,idx_R,idx_k,i)" che hai usato nel codice che hai pubblicato nella prima domanda?

    "u(:,:,idx_R,idx_k,i)"

    corrisponde ad una matrice (m x n)

    quindi nel tuo codice originale, ad ogni iterazione plottavi una intera matrice di dati.
    E' questo che volevi realmente fare?
    Diminuendo il pause ad esempio da 0.1 a 0.000001, aumenta la velocità con la quale i punti sul grafico vengono animati?
    [*] hai provato a cambiare il valore in input alla funzione "pause"? Cosa è successo?
    [*] hai provato a leggere la documentazione?


    Ad ogni modo, la risposta è sì, la velocità aumenta.
    La documentazione spiega chiaramente che la durata temporale della pausa è definito in secondi.
    Nella domanda hai scritto Diminuendo il pause ad esempio da 0.1 a 0.000001: davvero ti aspetti che una pausa di un milionesimo di secondo possa essere rappresentabile dal tuo programma e che, nel caso, sia "apprezzabile" da un osservatore?

    Nel codice che hai pubblicato, hai addirittura scritto

    pause(5/1000000000000)

    sono numeri scritti a caso oppure davvero pensi di una pausa di 5 picosecondi (5 millesimi di miliardesimo di secondo)?
    Per quanto riguarda la .gif invece ho provato a crearla, ma non viene "animata", la salvo nella cartella ed aprendola risulta essere una foto normale.
    Dal codice relativo alla generazione della "GIF" che hai pubblicato, sempre ammesso che tu abbia pubblicato "tutto" il codice, si direbbe che semplicemente, non hai copiato tutto il codice che hai trovato al link che ti ho suggerito.

    Il codice (completo) va inserito all'interno del loop di plottaggio.
  • Re: Creare grafico piano cartesiano animato

    [*] nei post precedenti non hai mai accennato al fatto che ci fosse più di un grafico
    [*] la foto del grafico che hai pubblicato contiene un solo grafico
    [*] come ti si può aiutare se non formuli le domande in modo corretto e, soprattutto, completo?
    pensavo che il fatto della presenza di più grafici non influisse.
    non mai visto prima utilizzare una matrice con 5 (cinque) dimensioni!

    Non riesco ad immaginare un codice che abbia bisogno di una matrice del genere: prova a semplificare le strutture dati usando variabili più "semplice" e più facilmente gestibili.
    Crea "più" matrici con un numero di dimensioni inferiore.
    Se non altro, dai un'occhiata alla documentazione relativa alla indicizzazione delle variabili

    https://it.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html
    https://it.mathworks.com/help/matlab/learn_matlab/array-indexing.html

    Sai a che porzione di dati corrisponde "u(:,:,idx_R,idx_k,i)" che hai usato nel codice che hai pubblicato nella prima domanda?

    "u(:,:,idx_R,idx_k,i)"

    corrisponde ad una matrice (m x n)

    quindi nel tuo codice originale, ad ogni iterazione plottavi una intera matrice di dati.
    E' questo che volevi realmente fare?
    Sono consapevole del fatto di avere un codice molto complicato, ma ogni indice mi serve, perchè ogni indice rappresenta una variabile del problema a cui è associato a sua volta un ciclo for. Per calcolare una variabile ho 5 cicli for 'uno dentro l'altro'.
    Probabilmente può essere ottimizzato, ma per le basi che ho di Matlab è già tanto che sono riuscito a scrivere questo codice!
    hai provato a cambiare il valore in input alla funzione "pause"? Cosa è successo?
    [*] hai provato a leggere la documentazione?
    http://it.mathworks.com/help/matlab/ref/pause.htm

    Ad ogni modo, la risposta è sì, la velocità aumenta.
    La documentazione spiega chiaramente che la durata temporale della pausa è definito in secondi.
    Nella domanda hai scritto Diminuendo il pause ad esempio da 0.1 a 0.000001: davvero ti aspetti che una pausa di un milionesimo di secondo possa essere rappresentabile dal tuo programma e che, nel caso, sia "apprezzabile" da un osservatore?

    Nel codice che hai pubblicato, hai addirittura scritto

    pause(5/1000000000000)

    sono numeri scritti a caso oppure davvero pensi di una pausa di 5 picosecondi (5 millesimi di miliardesimo di secondo)?
    si ho letto l'help di matlab, e ovviamente sapevo già la risposta alla mia domanda. Ma ho chiesto se cambiava perchè anche mettendo 0.00000000001 comunque il grafico non sembra affatto velocizzarsi. Sono all'incirca 5000 punti.
    Dal codice relativo alla generazione della "GIF" che hai pubblicato, sempre ammesso che tu abbia pubblicato "tutto" il codice, si direbbe che semplicemente, non hai copiato tutto il codice che hai trovato al link che ti ho suggerito.

    Il codice (completo) va inserito all'interno del loop di plottaggio.
    il codice è completo, perchè ho caricato solo i .txt delle variabili in un nuovo codice che mi servivano, per evitare il problema che anche gli altri grafici diventassero animati...mi sono arrangiato così.
    Ho aperto il link che avevi citato nella risposta precedente, ma non trovo nessuna parte riguardante la creazione di una GIF.

    Grazie per la pazienza.
  • Re: Creare grafico piano cartesiano animato

    Nella prima domanda hai scritto

    vorrei sapere come posso creare un grafico animato nel piano (X,Y). Devo plottare due variabili che sono dei vettori.

    Nell'ultima hai scritto:

    pensavo che il fatto della presenza di più grafici non influisse

    se si tratta di plottare più grafici con i dati memorizzati in matrici e non in vettori, certo che "influisce".

    Ad ogni modo, se hai i dati disponibili all'interno di matrici o se li leggi da files di testo, vale l'esempio di codice che ti ho proposto in una delle risposte precedenti.

    Sinceramente non si capisce cosa stai cercando di ottenere:

    [*] plottare tutti i grafici di tutte le variabili e renderli "animati"
    [*] plottarne solo uno (no specifichi come sceglierlo all'interno) della matrice e renderlo animato
    [*] plottarne più di uno, ma "animarne" solo uno

    A prescindere da quanti grafici vuoi plottare e come (animati o no) mi sembra che ora tu abbia tutte le informazioni necessarie.

    Per quanto riguarda la creazione di una "GIF" animata, in una delle risposte precedenti ti avevo suggerito:

    Se cerchi su Google "matlab gif" il primo risultato che viene proposto è quello che fa per te.

    A meno che la stessa ricerca effettuata su due PC diversi dia risultati diversi, il primo link proposto da Google è:

    https://it.mathworks.com/matlabcentral/answers/94495-how-can-i-create-animated-gif-images-in-matlab

    in quella pagina trovi il codice completo per creare una "GIF" animata:
    h = figure;
    axis tight manual % this ensures that getframe() returns a consistent size
    filename = 'testAnimated.gif';
    for n = 1:0.5:5
        % Draw plot for y = x.^n
        x = 0:0.01:1;
        y = x.^n;
        plot(x,y) 
        drawnow 
          % Capture the plot as an image 
          frame = getframe(h); 
          im = frame2im(frame); 
          [imind,cm] = rgb2ind(im,256); 
          % Write to the GIF File 
          if n == 1 
              imwrite(imind,cm,filename,'gif', 'Loopcount',inf); 
          else 
              imwrite(imind,cm,filename,'gif','WriteMode','append'); 
          end 
      end
      
    Nel codice che hai inserito in una risposta precedente hai scritto solo una parte di quel codice:
    % Capture the plot as an image 
      frame = getframe(h); 
      im = frame2im(frame); 
      [imind,cm] = rgb2ind(im,256); 
      % Write to the GIF File 
      
      imwrite(imind,cm,'s.gif','gif', 'Loopcount',inf)
      
    e, per di più, all'esterno del loop di plottaggio (come invece ti avevo suggerito e come è scritto nella pagina suggerita.

    Dal codice relativo alla generazione della "GIF" che hai pubblicato, sempre ammesso che tu abbia pubblicato "tutto" il codice, si direbbe che semplicemente, non hai copiato tutto il codice che hai trovato al link che ti ho suggerito.

    Il codice (completo) va inserito all'interno del loop di plottaggio.


    Di più non so cosa altro fare per aiutarti.
  • Re: Creare grafico piano cartesiano animato

    Risolto tutto, grazie mille.
  • Re: Creare grafico piano cartesiano animato

    Ottimo!
    Alla prossima.
Devi accedere o registrarti per scrivere nel forum
10 risposte