web-dev-qa-db-fra.com

Comment tracer une flèche avec les coordonnées de données dans Matlab?

Je sais qu'il existe une fonction appelée annotation qui permet de tracer des flèches ou des doubles flèches. Mais les annotations ne peuvent être tracées que dans une unité normalisée. Par exemple:

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

Ici, [x1, x2] devrait être un nombre de ratio inférieur à un.

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

Je me demande s’il existe une autre fonction pouvant aborder cette question ou si je peux obtenir la valeur d’axe de la figure pour pouvoir ajuster la valeur vraie en une valeur normalisée.

23
datcn

Je viens de découvrir cette méthode, car je ne veux pas m'embêter avec des unités normalisées. Utilisez l'interprète en 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 allonger la flèche, utilisez une taille de police plus grande.

Avantages

  • Plus facile, plus rapide et plus rapide que d'utiliser des unités normalisées
  • Pas besoin d'installer de fonctions (bon pour nous les paresseux ..)
  • en utilisant l’interpréteur LaTeX, il existe toute une gamme de flèches (haut, bas, gauche, droite et autres angles (voir Liste des symboles )

Les inconvénients

  • Il faut absolument des essais et des erreurs/ajustements pour obtenir le bon emplacement de la tête de flèche par rapport au POI.
  • Le contrôle de la longueur de la flèche est limité
  • Certaines commandes latex ne sont pas comprises par l'interprète (boo).
5
David_G

Pour le positionnement des annotations, Matlab propose la fonction dsxy2figxy pour convertir les points d'espace de données en coordonnées d'espace normalisées. Cependant, pour une raison quelconque, la fonction n'est pas incluse dans la distribution Matlab et doit être "créée" en premier. 

Copiez la ligne suivante dans la fenêtre de commande et exécutez-la pour ouvrir la fonction dans votre éditeur.

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

Pour utiliser la fonction dsxy2figxy, enregistrez-la quelque part dans votre chemin de recherche matlab. 

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

12
H.Muster

Même si annotation utilise normalized comme unités par défaut, vous pouvez associer ces objets aux axes actuels (gca) et utiliser des unités de données pour définir les propriétés X et Y

Voici un exemple de traçage 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

9
marsei

Pour ceux qui rencontrent ce sujet et cherchent à dessiner des flèches dans "l'espace de données" plutôt que dans des unités relatives à la figure et/ou aux axes, je recommande fortement arrow.m à partir de l'échange de fichiers.

8
tmpearce

Si je me souviens bien, vous devez calculer la position des axes par rapport à la figure.

ça 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 d'origine - ap (3), ap (4) sont la largeur et la hauteur de gca, et non les positions des coins

2
bdecaf

Après avoir créé l'objet d'annotation, vous devez définir la propriété Units sur une valeur absolue. Exemple:

arrowObj = annotation('arrow', [0.1 0.1], [0.5 0.5]);
set(arrowObj, 'Units', 'centimeters');
set(arrowObj, 'Position', [1 1 3 5]);
1
Deve

Vous pouvez utiliser le composant 'flèche' dans la boîte à outils (bien documentée) DaVinci Draw (divulgation complète: j'ai écrit/vendre la boîte à outils, bien que les flèches soient gratuites).

Exemple de syntaxe et exemple de sortie ci-dessous.

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

 enter image description here

0
Leonard Wayne

Une approche serait de définir une pointe de flèche dans les unités d'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’index de la flèche désirée dans une courbe vv, calculez

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
LasVegas