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.
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).
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
Même si annotation
normalized
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;
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
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]);
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.
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> )