Lapis Lazuli | Level 10

## Fun With SAS ODS Graphics: Mother and Child (Polygon+Ellipse+Vector Plots)

A bit late in the day, but Happy Mother's Day, all!

``````* Fun With SAS ODS Graphics: Mother and Child (Polygon+Ellipse+Vector Plots)
Points courtesy of Fahmihorizon from Mother icon (thenounproject.com/icon/mother-1477298)
X/Y coordinates obtained via the nifty PlotDigitizer app (plotdigitizer.com);

data mom;                                 * Generate required points;
input x y desc \$30.;
select (desc);
when ('Mom - Head - Center') do; mhcx=x; mhcy=y; input mhrx mhry desc \$30.; mhr=mhrx-mhcx; output; end;
when ('Mom - Body') do; mbx=x; mby=y; polygon=1; group=1; output; end;
when ('Carriage Top - Center') do; ctcx=x; ctcy=y; input ctlx ctly desc \$30.; ctr=ctcx-ctlx; output; retain ctcx; end;
when ('Carriage Bottom - Top Center') do;   * Note: Carriage is an ellipse masked with a polygon and bisected with a line;
cbtcx=x; cbtcy=y; input cbbcx cbbcy desc \$30.; input cbtrx cbtry desc \$30.; cbr2=cbtrx-cbbcx; cbr1=cbtcy-cbbcy; output;
polygonM=1; groupM=1; xM=ctcx; yM=cbtcy; output; yM+(cbtrx-cbbcx)+.01; output; xM=cbtcx+(cbtcy-cbbcy)+.01; output; yM=cbtcy;
vx=xM+.01; vy=yM; vxo=cbtcx-(cbtcy-cbbcy)-.01; vyo=yM; output; end;
when ('Left Wheel - Center') do; lwcx=x; lwcy=y; input lwtx lwty desc \$30.; lwr=lwty-lwcy; output; end;
when ('Right Wheel - Center') do; rwcx=x; rwcy=y; input rwtx rwty desc \$30.; rwr=rwty-rwcy; output; end;
when ('Handle') do; hx=x; hy=y+.01; input hxo hyo desc \$30.; hyo+(-.01); output; end;
end;                                      * Digitized points obtained via PlotDigitizer app (plotdigitizer.com);
datalines;
0.544594595 0.75261324  Mom - Body
0.468918919 0.534843206 Mom - Body
0.501351351 0.515679443 Mom - Body
0.559459459 0.681184669 Mom - Body
0.513513514 0.402439024 Mom - Body
0.555405405 0.400696864 Mom - Body
0.555405405 0.158536585 Mom - Body
0.595945946 0.156794425 Mom - Body
0.601351351 0.400696864 Mom - Body
0.612162162 0.400696864 Mom - Body
0.62027027  0.156794425 Mom - Body
0.659459459 0.156794425 Mom - Body
0.659459459 0.400696864 Mom - Body
0.705405405 0.400696864 Mom - Body
0.656756757 0.679442509 Mom - Body
0.709459459 0.520905923 Mom - Body
0.745945946 0.534843206 Mom - Body
0.67027027  0.75261324  Mom - Body
0.608108108 0.834494774 Mom - Head - Center
0.660810811 0.834494774 Mom - Head - Right
0.241891892 0.168989547 Left Wheel - Center
0.241891892 0.205574913 Left Wheel - Top
0.440540541 0.170731707 Right Wheel - Center
0.440540541 0.203832753 Right Wheel - Top
0.328378378 0.350174216 Carriage Top - Center
0.2         0.350174216 Carriage Top - Left
0.337837838 0.339721254 Carriage Bottom - Top Center
0.337837838 0.177700348 Carriage Bottom - Bottom Center
0.483783784 0.337979094 Carriage Bottom - Top Right
0.483783784 0.524390244 Handle
0.47027027  0.339721254 Handle
;                                       * Generate chart of mother/child (Polygon+Ellipse+Vector plots);
ods graphics / reset height=5.7in width=7.3in;;
proc sgplot data=mom aspect=1 noborder nowall noautolegend;
styleattrs backcolor=cxf10427;
ellipseparm semimajor=mhr semiminor=mhr / xorigin=mhcx yorigin=mhcy fill fillattrs=(color=white);       * Head;
polygon x=mbx y=mby id=polygon / fill fillattrs=(color=white) group=group nomissinggroup;               * Body;
ellipseparm semimajor=lwr semiminor=lwr / xorigin=lwcx yorigin=lwcy fill fillattrs=(color=white);       * Left carriage wheel;
ellipseparm semimajor=rwr semiminor=rwr / xorigin=rwcx yorigin=rwcy fill fillattrs=(color=white);       * Right carriage wheel;
ellipseparm semimajor=cbr1 semiminor=cbr2 / xorigin=cbtcx yorigin=cbtcy fill fillattrs=(color=white);   * Baby carriage;
polygon x=xM y=yM id=polygonM / fill fillattrs=(color=cxf10427) group=groupM nomissinggroup;            * Mask top right of ellipse to create sunscreen cover;
vector x=vx y=vy / xorigin=vxo yorigin=vyo noarrowheads lineattrs=(color=cxf10427 thickness=3pt);       * Bisect ellipese with a line;
vector x=hx y=hy / xorigin=hxo yorigin=hyo noarrowheads lineattrs=(color=white thickness=5pt);          * Carriage handle;
xaxis display=none min=-.05 max=.95 offsetmax=.001 offsetmin=.001;                                      * Limit x/y axis bounds;
yaxis display=none min=0 max=1 offsetmax=.001 offsetmin=.001;
inset "HAPPY MOTHER'S DAY!" / position=bottom textattrs=(size=14pt weight=bold color=white);            * Message at bottom;
run;``````

Grabbing x/y points with Plot Digitizer

Chart-in-Progress Pre-Fill "Wireframe"

PROC Star

## Re: Fun With SAS ODS Graphics: Mother and Child (Polygon+Ellipse+Vector Plots)

Wow! This takes me way back to when I actually used a physical plotter holding a sight pen which contained a lens plus cross-hairs to physically digitize a picture. Nice to know you can do it all virtually now!

Discussion stats