2014-09-08 142 views
19

Sto provando a disegnare una freccia nel grafico matlab, senza alcun successo.Come disegnare una freccia in Matlab?

Codice esempio:

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 possono trarre freccia? Grazie

+2

uso 'annotation' –

+0

quando si usa "l'annotazione ('freccia', x, y)" Im ottenendo errore ...? – user3668129

+0

come stai usando? cosa inserisci? comunque ci sono già 2 risposte sotto ... –

risposta

6

È possibile utilizzare il (ben documentata) DaVinci Draw toolbox (Full Disclosure: ho scritto/vendere la cassetta degli attrezzi, anche se le frecce sono gratis). La sintassi di esempio e l'output di esempio sono riportati di seguito.

davinci('arrow', 'X', [0 10], 'Y', [0 2], <plus-lots-of-options>) 

enter image description here

8

È possibile utilizzare arrow from the file exchange. 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, è possibile utilizzare annotation ma è necessario prendere in considerazione i limiti di trama.

annotation('arrow',x,y) 

crea un oggetto freccia di annotazione che si estende dal punto definito da x (1), y (1) per il punto definito da x (2), y (2), specificato in unità dato normalizzato . Puoi utilizzare la funzione Data space to figure units conversion (ds2nfu.m) dallo scambio di file per semplificarti la vita.

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

enter image description here

Nota che ci sono alcune caratteristiche non documentate che consentono appuntare le annotazioni ai grafici, se ciò che è necessario, saperne di più su di esso here ...

+0

+1: ho usato 'arrow' per molti anni. – rayryeng

38

Si potrebbe abusare quiver, in questo modo si non hanno a che fare con le unità dato normalizzato unhandy utilizzando 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) 

enter image description here

Importante è l'argomento 5 ° di quiver: che disabilita una scala altrimenti di default, in quanto questa funzione viene effettivamente utilizzato per tracciare campi vettoriali. (O utilizzare il valore poperty coppia 'AutoScale','off')

È inoltre possibile 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') 

enter image description here

Se non vi piacciono le punte delle frecce, è necessario tornare a annotazioni e questo risposta è utile maggio:

How do I change the arrow head style in quiver plot?


Alcune osservazioni riguardanti i commenti:

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

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]) 

enter image description here


The solution by sed sembra essere la migliore, perché offre teste di freccia regolabili.

avevo appena avrei 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 

cui è possibile 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 

si danno risultati abbastanza simili:

enter image description here

+0

Grazie, ma se voglio vedere il limite dei grafici (1..100) è possibile? – user3668129

+0

aggiungi 'xlim ([1, 100]); ylim ([1, 100]) 'come sempre – thewaywewalk

+0

sembra non funzionare ... provalo – user3668129

6

Tra le altre soluzioni, ecco uno che utilizza annotation in cui è possibile 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); 

enter image description here

+0

+1 ai miei occhi, meglio non - Soluzione di scambio di merci. Ho sfruttato un po 'la tua idea per renderla più versatile. – thewaywewalk

2

È inoltre possibile utilizzare per esempio

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

See illustration

Problemi correlati