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.
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
Les inconvénients
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
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;
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.
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
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]);
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> )
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.