BookmarkSubscribeRSS Feed
tc
Lapis Lazuli | Level 10 tc
Lapis Lazuli | Level 10

mothersday.png

 

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 DigitizerGrabbing x/y points with Plot Digitizer

 

Chart-in-Progress Pre-Fill "Wireframe"Chart-in-Progress Pre-Fill "Wireframe"

1 REPLY 1
SASKiwi
PROC Star

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!

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 1 reply
  • 887 views
  • 4 likes
  • 2 in conversation