web-dev-qa-db-fra.com

Comment dessiner une flèche dans Matlab?

J'essaie de dessiner une flèche dans le graphique matlab, sans succès.

Exemple de code:

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

Y a-t-il une fonction dans matlab qui peut dessiner une flèche? Merci

22
user3668129

Vous pouvez utiliser la (bien documentée) boîte à outils DaVinci Draw (divulgation complète: j'ai écrit/vendu la boîte à outils, bien que les flèches soient gratuites). Voici un exemple de syntaxe et d'exemple de sortie.

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

enter image description here

6
Leonard Wayne

Vous pourriez abuser (quiver , de cette façon, vous n'avez pas à gérer les unités de chiffres normalisées peu pratiques en utilisation de 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

Important est le 5ème argument de quiver: 0 ce qui désactive une mise à l'échelle par défaut, car cette fonction est en fait utilisée pour tracer des champs vectoriels. (ou utilisez la paire de valeurs de propriété 'AutoScale','off')

Vous pouvez également ajouter des fonctionnalités supplémentaires:

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

Si vous n'aimez pas les pointes de flèche, vous devez revenir aux annotations et cette réponse peut être utile:

Comment puis-je changer le style de tête de flèche dans le tracé de carquois?


Quelques remarques concernant les commentaires:

La taille de la tête de flèche peut être ajustée avec le 'MaxHeadSize' propriété, ce n'est malheureusement pas cohérent. Les limites des axes doivent ensuite être définies

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


La solution de sed semble être la meilleure, car elle propose des têtes de flèches réglables.

Je voudrais simplement l'envelopper dans une fonction:

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

que vous pouvez appeler à partir de votre script comme suit:

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

vous donnant des résultats assez similaires:

enter image description here

46
thewaywewalk

Vous pouvez utiliser arrow à partir de l'échange de fichiers . arrow(Start,Stop) trace une ligne avec une flèche du début à la fin (les points doivent être des vecteurs de longueur 2 ou 3 ou des matrices à 2 ou 3 colonnes) et renvoie la poignée graphique de la ou des flèches.

Edit: @Lama a également raison, vous pouvez utiliser annotation mais vous devez tenir compte de la limites de la parcelle.

annotation('arrow',x,y)

crée un objet d'annotation de flèche qui s'étend du point défini par x (1), y (1) au point défini par x (2), y (2), spécifié en unités de figures normalisées . Vous pouvez utiliser la fonction Espace de données pour convertir les unités de chiffres (ds2nfu.m) de l'échange de fichiers pour vous faciliter la vie.

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

enter image description here

Notez qu'il existe des fonctionnalités non documentées qui permettent d'épingler des annotations aux graphiques si cela est nécessaire, en savoir plus ici ...

8
bla

Parmi d'autres solutions, voici une utilisant annotation où vous pouvez définir les propriétés des flèches, y compris (x,y,width,height)dans les axes actuels, les propriétés head et line.

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

donne

enter image description here

6
marsei

Vous pouvez également utiliser par exemple

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

Voir l'illustration

2
Flo