webentwicklung-frage-antwort-db.com.de

Wie zeichnet man einen Pfeil mit Datenkoordinaten in Matlab?

Ich weiß, dass es eine Funktion namens Annotation gibt, die Pfeile oder Doppelpfeile darstellen kann. Anmerkungen können jedoch nur in normalisierten Einheiten dargestellt werden. Zum Beispiel:

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

Hier sollte [x1, x2] eine Verhältniszahl kleiner als Eins sein.

Meine Frage ist also, wie kann ich Pfeile mit einem wahren Wert anstatt mit einem normalisierten Wert zeichnen?

Ich frage mich, ob es eine andere Funktion gibt, die sich diesem Ansatz annähern kann, oder gibt es eine Funktion, mit der ich den Achsenwert der Figur ermitteln kann, damit ich den wahren Wert in einen normalisierten Wert einstellen kann.

23
datcn

Ich habe diese Methode gerade entdeckt, da ich mich nicht mit normalisierten Einheiten beschäftigen möchte. Verwenden Sie den Latex-Interpreter:

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]')

Um den Pfeil länger zu machen, verwenden Sie eine größere Schriftgröße.

Pros

  • Einfacher, schneller und schneller als normalisierte Einheiten
  • Keine Funktionen installieren (gut für uns faule Leute ..)
  • mit dem LaTeX-Interpreter gibt es eine ganze Reihe von Pfeilen (nach oben, unten, links, rechts und andere Winkel) (siehe Symbolliste )

Cons

  • Erfordert auf jeden Fall ein Ausprobieren, um die korrekte Position des Pfeilkopfes relativ zum POI zu ermitteln.
  • Die Länge des Pfeils ist begrenzt
  • Einige Latexbefehle werden vom Interpreter nicht verstanden.
5
David_G

Für die Positionierung von Anmerkungen bietet Matlab die Funktion dsxy2figxy zum Konvertieren von Datenraumpunkten in normalisierte Raumkoordinaten. Aus irgendeinem Grund ist die Funktion jedoch nicht in der Matlab-Distribution enthalten und muss zuerst "erstellt" werden. 

Kopieren Sie die folgende Zeile in das Befehlsfenster und führen Sie sie aus, um die Funktion in Ihrem Editor zu öffnen.

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

Um die Funktion dsxy2figxy zu verwenden, speichern Sie sie irgendwo in Ihrem Matlab-Suchpfad. 

Die vollständige Anleitung zur Funktion dsxy2figxy finden Sie unter matlab-central: http://www.mathworks.de/help/techdoc/creating_plots/bquk5ia-1.html

12
H.Muster

Obwohl annotationnormalized als Standardeinheiten verwendet, können Sie diese Objekte den aktuellen Achsen (gca) zuordnen und Dateneinheiten zum Festlegen der Eigenschaften von X und Y verwenden. 

Hier ist ein Beispiel zum Zeichnen eines einzelnen Pfeils.

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

Für jeden, der auf dieses Thema stößt und eher im "Datenraum" als in Einheiten relativ zu der Figur und/oder den Achsen zeichnet, empfehle ich arrow.m vom Dateiaustausch.

8
tmpearce

Wenn ich mich recht erinnere, müssen Sie die Position der Achsen in Bezug auf die Abbildung berechnen.

es sollte so gehen:

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

Hinweis Fixer Versatz in der Originalberechnung - ap (3), ap (4) sind Breite und Höhe von gca, nicht Eckpositionen

2
bdecaf

Nach dem Erstellen des Anmerkungsobjekts sollten Sie die Eigenschaft Units auf eine absolute Eigenschaft setzen. Beispiel:

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

Sie können die 'Pfeil'-Komponente in der (gut dokumentierten) DaVinci Draw-Toolbox verwenden (vollständige Offenlegung: Ich habe die Toolbox geschrieben/verkauft, Pfeile sind jedoch frei).

Beispielsyntax und Beispielausgabe finden Sie unten.

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

 enter image description here

0
Leonard Wayne

Ein Ansatz wäre die Definition einer Pfeilspitze in den Achseneinheiten:

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

Berechnen Sie dann am gewünschten Pfeilindex auf einer Kurve vv

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

Für mich gearbeitet, für meine besonderen Umstände.

0
LasVegas