Come disegnare una freccia in Matlab?

Sto provando a disegnare una freccia nel grafico matlab, senza alcun successo.

Esempio di codice:

function [ output_args ] = example( input_args ) figure ('Name', 'example'); x = [10 30] y = [10 30] xlim([1, 100]) ylim([1, 100]) arrow (x, y) ??? end 

C’è qualche funzione in MATLAB che può disegnare una freccia? Grazie

È ansible utilizzare la (ben documentata) casella degli strumenti DaVinci Draw (completa divulgazione: ho scritto / venduto la cassetta degli attrezzi, sebbene le frecce siano gratuite). La syntax di esempio e l’output di esempio sono riportati di seguito.

 davinci( 'arrow', 'X', [0 10], 'Y', [0 2],  ) 

inserisci la descrizione dell'immagine qui

Si può abusare della quiver , in questo modo non si ha a che fare con unità di figure normalizzate non coerenti mediante l’uso di annotation

 drawArrow = @(x,y) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0 ) x1 = [10 30]; y1 = [10 30]; drawArrow(x1,y1); hold on x2 = [25 15]; y2 = [15 25]; drawArrow(x2,y2) 

inserisci la descrizione dell'immagine qui

Importante è il quinto argomento di quiver : 0 che disabilita un ridimensionamento altrimenti predefinito, in quanto questa funzione viene effettivamente utilizzata per tracciare i campi vettoriali. (o utilizzare la coppia di valori 'AutoScale','off' )

Puoi anche aggiungere funzionalità aggiuntive:

 drawArrow = @(x,y,varargin) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0, varargin{:} ) drawArrow(x1,y1); hold on drawArrow(x2,y2,'linewidth',3,'color','r') 

inserisci la descrizione dell'immagine qui

Se non ti piacciono le punte delle frecce, è necessario tornare alle annotazioni e questa risposta potrebbe essere utile:

Come posso cambiare lo stile della testa della freccia nella trama del quiver?


Alcune osservazioni riguardo i commenti:

La dimensione della freccia può essere regolata con la proprietà 'MaxHeadSize' , purtroppo non è coerente. I limiti degli assi devono essere impostati in seguito

 x1 = [10 30]; y1 = [10 30]; drawArrow(x1,y1,{'MaxHeadSize',0.8,'Color','b','LineWidth',3}); hold on x2 = [25 15]; y2 = [15 25]; drawArrow(x2,y2,{'MaxHeadSize',10,'Color','r','LineWidth',3}); hold on xlim([1, 100]) ylim([1, 100]) 

inserisci la descrizione dell'immagine qui


La soluzione di sed sembra essere la migliore, perché offre teste di freccia regolabili.

Vorrei solo avvolgerlo in una funzione:

 function [ h ] = drawArrow( x,y,xlimits,ylimits,props ) xlim(xlimits) ylim(ylimits) h = annotation('arrow'); set(h,'parent', gca, ... 'position', [x(1),y(1),x(2)-x(1),y(2)-y(1)], ... 'HeadLength', 10, 'HeadWidth', 10, 'HeadStyle', 'cback1', ... props{:} ); end 

che puoi chiamare dal tuo script come segue:

 drawArrow(x1,y1,[1, 100],[1, 100],{'Color','b','LineWidth',3}); hold on drawArrow(x2,y2,[1, 100],[1, 100],{'Color','r','LineWidth',3}); hold on 

dandoti risultati abbastanza simili:

inserisci la descrizione dell'immagine qui

È ansible utilizzare la arrow dallo scambio di file . arrow(Start,Stop) disegna una linea con una freccia da Start a Stop (i punti dovrebbero essere vettori di lunghezza 2 o 3, o matrici con 2 o 3 colonne) e restituisce l’handle grafico della (e) freccia (e).

Modifica: @Lama ha anche ragione, puoi usare l’ annotation ma devi tenere conto dei limiti di trama.

 annotation('arrow',x,y) 

crea un object annotazione freccia che si estende dal punto definito da x (1), y (1) al punto definito da x (2), y (2), specificato in unità di misura normalizzate . Puoi utilizzare lo spazio dati per calcolare la funzione di conversione delle unità (ds2nfu.m) dallo scambio di file per semplificarti la vita.

 [xf yf]=ds2nfu(x,y); annotation(gcf,'arrow', xf,yf) 

inserisci la descrizione dell'immagine qui

Nota che ci sono alcune funzionalità non documentate che consentono di annotare le annotazioni sui grafici se necessario, leggi di più qui …

Tra le altre soluzioni, ecco una delle annotation cui è ansible impostare le proprietà della freccia tra cui (x,y,width,height) all’interno degli assi correnti , le proprietà della testa e della linea.

 h=annotation('arrow'); set(h,'parent', gca, ... 'position', [50 5 20 2], ... 'HeadLength', 1000, 'HeadWidth', 100, 'HeadStyle', 'hypocycloid', ... 'Color', [0.4 0.1 0.8], 'LineWidth', 3); 

inserisci la descrizione dell'immagine qui

Puoi anche usare per esempio

 text(x,y,'\leftarrow t_1','FontSize',12,'FontWeight','bold') 

Vedi l’illustrazione