Die Makros lesen keine bestehenden Daten aus Tabellen oder externen Dateien. Sie generieren Punkte (x, y) und Funktionen ('MOVE', 'DRAW'), die dann in einem SAS/GRAPH-Annotationsdatensatz ausgegeben werden. Sie dienen somit der Erstellung grafischer Daten und nicht deren Verarbeitung.
1 Codeblock
MACRO %ARROW Data
Erklärung : Das Makro '%arrow' ist das Herzstück des Systems. Es nimmt die Startkoordinaten (x1, y1) und Endkoordinaten (x2, y2) eines Pfeils entgegen, sowie Parameter für die Größe der Pfeilspitze (vechead) und deren Farbe. Es beginnt mit dem Zeichnen der Hauptlinie des Pfeils durch Aufruf von '%line'. Wenn dann eine Pfeilspitze angegeben ist, berechnet es die Steigung des Vektors und verwendet dann '%linept', um die Punkte zu bestimmen, die die Pfeilspitze bilden. Die Variablen 'x', 'y' und 'function' werden manipuliert und ausgegeben, um das grafische Objekt in einem Annotationsdatensatz zu erstellen. Es behandelt Fälle von Nullsteigungen, um Divisionen durch Null zu vermeiden.
Kopiert!
%macro arrow(
x1, y1, /* start point */
x2, y2, /* end point, with arrow head */
vechead=2.0 0.5, /* head length and perpendicular offset */
color=,
vtoh=1 /* plot aspect ratio in XSYS,YSYS coordinates */
);
%let singular = 1e-8; /* approximate zero */
*------set up vector heads------;
%let headr = %scan(%bquote(&vechead),1,%str( ));
%let headw = %scan(%bquote(&vechead),2,%str( ));
%if %length(%bquote(&headw)) = 0 %then %let headr = ;
%if %length(%bquote(&vechead)) = 0 or %length(%bquote(&headw))
%then %let vechead = %str( );
drop vecslope headx heady xonvec yonvec;
comment = 'vector ';
%if %length(&color) %then
%str(color="&color");
%line(&x1, &y1, &x2, &y2);
%if %length(&headw) %then %do;
comment = 'vechead';
*------compute slope of vector------;
vecslope = &x2 - &x1;
if abs(vecslope) > &singular then
vecslope = (&y2 - &y1) / (vecslope / (&vtoh));
else vecslope = .;
*------find point on vector headr distance from end------;
%*linept(xtick,&nlines - ytick,headx,heady,vecslope,-&headr);
%linept(&x2,&y2,headx,heady,vecslope,-&headr);
*------slope of line perpendicular to vector------;
if vecslope = . then vecslope = 0;
else if abs(vecslope) > &singular
then vecslope = -1.0 / vecslope;
else vecslope = .;
*------draw vector head------;
%linept(headx,heady,xonvec,yonvec,vecslope,-&headw);
line=1;
x = xonvec; y = yonvec; function = 'DRAW '; output;
%linept(headx,heady,xonvec,yonvec,vecslope,&headw);
%line(&x2,&y2,xonvec,yonvec);
%end;
%mend;
1
%macro arrow(
2
x1, y1, /* start point */
3
x2, y2, /* end point, with arrow head */
4
vechead=2.00.5, /* head length and perpendicular offset */
5
color=,
6
vtoh=1/* plot aspect ratio in XSYS,YSYS coordinates */
Erklärung : Das Makro '%line' ist ein einfaches Hilfsmittel zum Zeichnen einer Linie. Es akzeptiert die Startkoordinaten (x1, y1) und Endkoordinaten (x2, y2). Es verwendet die Funktion 'MOVE ', um den Cursor an den Startpunkt zu positionieren, ohne zu zeichnen, und dann 'DRAW ', um eine Linie zum Endpunkt zu zeichnen. Jedes Koordinatenpaar mit seiner Funktion wird ausgegeben, um dem Annotationsdatensatz hinzugefügt zu werden.
Kopiert!
*------draw a line------;
%macro line(x1,y1,x2,y2);
x = &x1; y = &y1; function = 'MOVE '; output;
x = &x2; y = &y2; function = 'DRAW '; output;
%mend line;
1
*------draw a line------;
2
%macro line(x1,y1,x2,y2);
3
4
x = &x1; y = &y1; function = 'MOVE '; OUTPUT;
5
x = &x2; y = &y2; function = 'DRAW '; OUTPUT;
6
7
%mend line;
3 Codeblock
MACRO %LINEPT
Erklärung : Das Makro '%linept' ist eine Berechnungsfunktion, die die Koordinaten eines neuen Punkts (px, py) in einer Entfernung 'r' von einem bestehenden Punkt (x, y) entlang einer Linie mit einer Steigung 'm' bestimmt. Die Richtung wird durch das Vorzeichen von 'r' gesteuert. Es behandelt zwei Hauptfälle: wenn die Steigung 'm' definiert ist (nicht-vertikale Linie) und wenn 'm' fehlt (vertikale Linie). Es berechnet die neuen Koordinaten unter Verwendung geometrischer Prinzipien und weist sie den Makrovariablen 'px' und 'py' zu. Dieses Makro ist ein internes Hilfsmittel, das von '%arrow' verwendet wird, um die Positionen der Elemente der Pfeilspitze zu berechnen.
Kopiert!
*------find a point (px,py) r distance from (x,y) on a ------;
*------line with slope m, negative r means toward origin------;
%macro linept(x,y,px,py,m,r);
drop vecdir vecm2;
vecdir = -sign(&r);
if &m ne . then do;
vecm2 = sqrt((&r) * (&r) / (1.0 + (&m) * (&m)));
if (&x) > (&x1) then vecm2 = -vecm2;
&px = vecdir * vecm2 + (&x);
&py = vecdir * (&m) * vecm2 / (&vtoh) + (&y);
end;
else do;
&px = (&x);
&py = abs(&r);
if (&y) > (&y1) then vecdir = -vecdir;
&py = vecdir * (&py) / (&vtoh) + (&y);
end;
%mend linept;
1
*------find a point (px,py) r distance from (x,y) on a ------;
2
*------line with slope m, negative r means toward origin------;
3
%macro linept(x,y,px,py,m,r);
4
5
drop vecdir vecm2;
6
vecdir = -sign(&r);
7
8
IF &m ne . THENDO;
9
vecm2 = sqrt((&r) * (&r) / (1.0 + (&m) * (&m)));
10
IF (&x) > (&x1) THEN vecm2 = -vecm2;
11
&px = vecdir * vecm2 + (&x);
12
&py = vecdir * (&m) * vecm2 / (&vtoh) + (&y);
13
END;
14
15
ELSEDO;
16
&px = (&x);
17
&py = abs(&r);
18
IF (&y) > (&y1) THEN vecdir = -vecdir;
19
&py = vecdir * (&py) / (&vtoh) + (&y);
20
END;
21
22
%mend linept;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.