Comment tracer une flèche sur une figure dans Matlab?

je sais qu'il existe une fonction appelée annotation qui peut tracer des flèches ou des flèches doubles. Mais l'annotation ne peut se faire qu'en unité normalisée. Par exemple:

annotation('arrows',[x1 x2],[y1 y2])

Ici, [x1, x2] devrait être un taux inférieur à un.

Donc, ma question est comment puis-je tracer des flèches avec une vraie valeur plutôt qu'une valeur normalisée?

je me demande s'il y a une autre fonction qui peut s'approcher de cela ou y a-t-il une fonction qui puisse obtenir la valeur de l'axe de la figure pour que je puisse ajuster la valeur vraie dans une valeur normalisée.

22
demandé sur Bhargav Rao 2012-07-16 10:51:14

8 réponses

je viens de découvrir cette méthode, car je ne veux pas avoir à me soucier des unités normalisées. Utilisez l'interpréteur latex:

figure
plot([1:5],[1:5]*3,'.-')
%// Say I want to put an arrow pointing to the location, [3 9]    
text(2.94,8.3,'\uparrow','fontsize',20)
text(2.8,7.8,'point [3,9]')

pour rallonger la flèche, utilisez une plus grande fontsize.

Pros

  • plus facile, plus rapide et plus rapide que l'utilisation d'unités normalisées
  • pas besoin d'installer de fonctions (bon pour nous les gens paresseux..)
  • en utilisant L'interpréteur LaTeX, il y a toute une gamme de flèches (haut, bas, gauche, droite et d'autres angles (voir liste des symboles)

Cons

  • a certainement besoin d'essais et d'erreurs / de retouches pour obtenir la position correcte de la tête de flèche par rapport au POI.
  • il y a peu de contrôle sur la longueur de la flèche
  • certaines commandes latex ne sont pas comprises par l'interpréteur (boo).
5
répondu David_G 2013-06-13 00:43:55

Pour le positionnement des annotations, Matlab offre la fonction dsxy2figxy pour convertir les points d'espace de données en coordonnées spatiales normalisées. Cependant, pour quelque raison que ce soit, la fonction N'est pas incluse dans la distribution Matlab et doit être "créée" en premier.

Copier la ligne suivante dans la fenêtre de commande et l'exécuter pour ouvrir la fonction dans votre éditeur.

edit(fullfile(docroot,'techdoc','creating_plots','examples','dsxy2figxy.m'))

pour utiliser la fonction dsxy2figxy enregistrez-le quelque part dans votre chemin de recherche matlab.

vous trouverez les instructions complètes pour la fonction dsxy2figxy à matlab-central: http://www.mathworks.de/help/techdoc/creating_plots/bquk5ia-1.html

12
répondu H.Muster 2012-07-16 12:07:22

pour quiconque tombe sur ce sujet cherchant à dessiner des flèches dans" data space " plutôt que dans des unités relatives à la figure et/ou aux axes, je recommande fortement flèche.m de l'échange de fichiers.

8
répondu tmpearce 2012-07-16 13:59:10

Même si annotationnormalized en tant qu'unités par défaut, vous pouvez associer ces objets aux axes courants (gca) et utilisez des unités de données pour définir X et Y propriétés.

Voici un exemple de tracé d'une seule flèche.

plot(1:10);
ha = annotation('arrow');  % store the arrow information in ha
ha.Parent = gca;           % associate the arrow the the current axes
ha.X = [5.5 5.5];          % the location in data units
ha.Y = [2 8];   

ha.LineWidth  = 3;          % make the arrow bolder for the picture
ha.HeadWidth  = 30;
ha.HeadLength = 30;

enter image description here

8
répondu marsei 2016-03-29 17:07:59

si je me souviens bien, il faut calculer la position des axes par rapport à la figure.

il devrait aller comme:

%% example plot
clf
plot(rand(5,2)*5)
%% get info specific to the axes you plan to plot into
set(gcf,'Units','normalized')
set(gca,'Units','normalized')
ax = axis;
ap = get(gca,'Position')
%% annotation from 1,2 to 3,4
xo = [1,3];
yo = [2,4];
xp = (xo-ax(1))/(ax(2)-ax(1))*ap(3)+ap(1);
yp = (yo-ax(3))/(ax(4)-ax(3))*ap(4)+ap(2);
ah=annotation('arrow',xp,yp,'Color','r');

Remarque: décalage fixe dans le calcul initial-ap(3), ap(4) sont la largeur et la hauteur de gca, pas les positions de coin

2
répondu bdecaf 2013-06-26 08:41:48

après avoir créé l'objet annotation, vous devez définir la propriété Unités pour un absolu. Exemple:

arrowObj = annotation('arrow', [0.1 0.1], [0.5 0.5]);
set(arrowObj, 'Units', 'centimeters');
set(arrowObj, 'Position', [1 1 3 5]);
1
répondu Deve 2012-07-16 08:36:03

Une approche pourrait être de définir une pointe de flèche dans les unités de l'axe:

Ax=[0 -0.003 0.003 0];       % (Ax,Ay) form an upward pointing arrowhead.
Ay=[0.01 0.0060 0.0060 0.01];
Ax=Ax-mean(Ax);  % center it on zero
Ay=Ay-mean(Ay);

puis à l'indice de flèche désiré dans sur la courbe vv, calculer

x1=vv(in,1); y1=vv(in,2);
x2=vv(in+1,1); y2=vv(in+1,2);
u=x2-x1;
v=y2-y1;
th=-pi/2+atan2(v,u);
R=[cos(th) -sin(th); sin(th) cos(th)];   % Rotation matrix for local slope of vv.
A=R*[Ax;Ay];    % Rotate the arrowhead.
patch(x1+A(1,:),y1+A(2,:),'r','LineWidth',0.01)   % plot rotated arrowhead at (x1,y1).
plot(x1+A(1,:),y1+A(2,:),'r','LineWidth',0.01)    % Kludge to make boundary red too (I'm sure there is a more elegant way).

travaillé pour moi, pour ma situation particulière.

0
répondu LasVegas 2015-01-24 03:17:32

Vous pouvez utiliser le composant' arrow ' dans le (bien documenté) DaVinci Tirage boîte à outils (divulgation complète: j'ai écrit/vendre la boîte à outils, bien que les flèches sont libres).

la syntaxe D'exemple et la sortie d'exemple sont ci-dessous.

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

enter image description here

0
répondu Leonard Wayne 2015-12-15 06:03:49