Plot 3D

di il
5 risposte

Plot 3D

Ciao, devo fare un plot 3D. Ho una matrice [A B C] dove A B C sono vettori 10x1 e formano così una matrice 10x3. Nel realizzare il plot, considerando ogni singola riga, devo mettere sul piano i valori di A e B; il corrispondente valore di C deve rappresentare il picco del grafico nella terza dimensione.
Come faccio a realizzare un grafico di questo tipo? Ho provato ad utilizzare la funzione surf ma non riesco.
Grazie

5 Risposte

  • Re: Plot 3D

    Avendo a disposizione (come riportato nella domanda) una matrice 10x3 le prime due colonne della quale rappresentano le coordinate X e Y, i valori della terza colonna (Z) rappresentano una curva nello spazio.
    Per creare un grafico della curva si può usare la funzione "plot3" (versione "3D" della funzione "plot"):

    La funzione "surf" richiede in input, come minimo, una matrice per cui, sempre con riferimento alla matrice descritta nella domanda, tutta la matrice [A B C] costituirebbe l'input per la funzione "surf".

    L'help in linea di MatLab riporta degli esempi molto chiari per entrambe le funzioni.

    Hope this helps.
  • Re: Plot 3D

    Grazie, ho provato ma non ottengo il risultato desiderato. Con la funzione plot3 mi vengono rappresentate semplicemente due rette, io invece vorrei visualizzare una figura in 3D in modo che i valori delle prime due colonne sono i valori sul piano (x,y) e il corrispondente valore della terza colonna rappresenta "l'altezza" della funzione sull'asse z.
    Come faccio?
  • Re: Plot 3D

    Di principio è strano che vengano due rette.
    Se pubblicassi i valori della matrice (o almeno una parte se la matrice è molto grande) si potrebbe cercare di capire qual è il problema.
  • Re: Plot 3D

    Ok, la matrice in realtà ha dimensioni 156x3 ma qui pubblico le prime 30 righe.
    1.0000000e+003  3.0062596e+003  5.4290294e+000
      1.0718910e+003  2.6213775e+003  4.7298775e+000
      1.1489510e+003  2.2857725e+003  4.1202367e+000
      1.2315510e+003  1.9932039e+003  3.5887737e+000
      1.3200880e+003  1.7382071e+003  3.1255644e+000
      1.4149910e+003  1.5159972e+003  2.7219110e+000
      1.5167170e+003  1.3223887e+003  2.3702129e+000
      1.6257560e+003  1.1537235e+003  2.0638258e+000
      1.7426330e+003  1.0068058e+003  1.7969451e+000
      1.8679140e+003  8.7884442e+002  1.5644978e+000
      2.0022000e+003  7.6740421e+002  1.3620628e+000
      2.1461410e+003  6.7035940e+002  1.1857773e+000
      2.3004300e+003  5.8585652e+002  1.0322745e+000
      2.4658110e+003  5.1227921e+002  8.9861822e-001
      2.6430810e+003  4.4821780e+002  7.8224854e-001
      2.8330960e+003  3.9244426e+002  6.8093353e-001
      3.0367710e+003  3.4388850e+002  5.9273007e-001
      3.2550890e+003  3.0161764e+002  5.1594332e-001
      3.4891010e+003  2.6481945e+002  4.4909813e-001
      3.7399370e+003  2.3278606e+002  3.9090833e-001
      4.0088060e+003  2.0490136e+002  3.4025480e-001
      4.2970050e+003  1.8062837e+002  2.9616192e-001
      4.6059220e+003  1.5949971e+002  2.5778088e-001
      4.9370480e+003  1.4110834e+002  2.2437235e-001
      5.2919790e+003  1.2509978e+002  1.9529220e-001
      5.6724260e+003  1.1116566e+002  1.6998035e-001
      6.0802240e+003  9.9037050e+001  1.4794832e-001
      6.5173400e+003  8.8480203e+001  1.2877142e-001
      6.9858800e+003  7.9291505e+001  1.1207981e-001
      7.4881040e+003  7.1293683e+001  9.7551521e-002
    Ho scritto questo semplice codice:
    load RL.txt
    a=RL;
    f=a(:,1);
    R=a(:,2);
    L=a(:,3);
    plot3(R,L,f)
    Carico il file .txt e la seconda e terza colonna (R e L) sono sul piano xy, mentre l'altezza (variabile f, prima colonna) deve rappresentare il valore sull'asse z. Eseguendo la funzione plot3 mi vengono due rette e non una figura in 3D
  • Re: Plot 3D

    Ho provato a riportare i dati in un file di testo ("RL.txt") ed il codice inserito nella domanda ed ho correttamente ottenuto una curva in un grafico "3D".

    La curva ottenuta è visualizzata nella prima immagine in calce.

    ho quindi aggiunto al codice originale alcune istruzioni per, nell'ordine:
    [*] visualizzazione griglia
    [*] modifica del punto di vista. La variazione del punto di vista si può effettuare sia via codice tramite la funzione "view", sia manualmente cliccando sull'icona "Rotate 3D" presente nella "Figure toolbar" della "figure" (accessibile, se non visualizzata di default, tramite la voce di menu "View").
    [*] label degli assi
    [*] modifica del valore minimo dell'asse "Z"
    [*] definizione dell'"data aspect ratio" (istruzione commentata)

    queste istruzioni hanno il solo effetto di rendere il grafico "più chiaro", ma non influiscono in alcun modo sui dati di input e sul comportamento della funzione "plot3".
    C'è da notare che i valori della terza colonna (i quali vengono definiti come ordinate del grafico) sono di 3 ordini di grandezza inferiori a quelle ascisse e dell'asse "Z".
    Se si setta il "data aspect ratio" del grafico in modo che le scale dei valori sui tre assi siano le stesse (istruzione 'daspect([1 1 1])') si ottiene l'effetto che l'asse Y sembra "scomparire", dando l'impressione che si tratti di un grafico "2D" (la cosa si può verificare "scommentando" l'istruzione nello script riportato in basso).

    La curva ottenuta è riprodotta nella seconda immagine in calce.

    Una ulteriore aggiunta al codice originale, inserisce nel grafico della curva delle righe verticali, una per ogni punto per "dare l'idea" dell'altezza.

    La curva è riprodotta nella terza immagine in calce.

    In conclusione, come atteso, utilizzando i dati memorizzati all'interno del file "RL.txt", la funzione "plot3" genera regolarmente una curva nello spazio "3D".


    Lo script è riportato di seguito.
    
    % 
    % Codice originale
    % 
    load RL.txt
    a=RL;
    f=a(:,1);
    R=a(:,2);
    L=a(:,3);
    plot3(R,L,f)
    %
    % Codice aggiunto:
    %    visualizzazione griglia
    %    modifica del punto di vista
    %    label degli assi
    %    modifica del valore minimo dell'asse "Z"
    %    definizione dell'"data aspect ratio" (istruzione commentata)
    %
    grid on
    view([-70 10])
    xlabel('Asse X ==> R=a(:,2)')
    ylabel('Asse Y ==> L=a(:,3)')
    zlabel('Asse Z ==> f=a(:,1)')
    z_lim=get(gca,'zlim');
    zlim([0 z_lim(2)]);
    % daspect([1 1 1]);
    % 
    % Codice aggiunto per creare un nuovo grafico
    % 
    figure
    % 
    % Plot della curva originale
    % 
    plot3(R,L,f,'linewidth',2)
    hold on
    % 
    % Plot di righe verticali per "dare l'idea della terza dimensione"
    % 
    for i=1:length(R)
       plot3([R(i) R(i)],[L(i) L(i)],[0 f(i)],'r');
    end
    % 
    % Come per il grafico precedente:
    %    visualizzazione griglia
    %    modifica del punto di vista
    %    label degli assi
    %    modifca del valoe minimo dell'asse "Z"
    %    definizione dell'"data aspect ratio" (istruzione commentata)
    % 
    grid on
    xlabel('Asse X ==> R=a(:,2)')
    ylabel('Asse Y ==> L=a(:,3)')
    zlabel('Asse Z ==> f=a(:,1)')
    z_lim=get(gca,'zlim');
    zlim([0 z_lim(2)]);
    view([-70 10])
    
    Hope this helps.
    Allegati:
    Grafico ottenuto con lo script originale
    Grafico ottenuto con lo script originale

    Grafico con aggiunta della griglia, delle etichette degli assi e con il punto di vista modifcato
    Grafico con aggiunta della griglia, delle etichette degli assi e con il punto di vista modifcato

    Grafico con linee verticali che congiungono i punti della curva con il piano "XY"
    Grafico con linee verticali che congiungono i punti della curva con il piano "XY"
Devi accedere o registrarti per scrivere nel forum
5 risposte