BookmarkSubscribeRSS Feed
Explode mk2 using ods graphics and proc template
DanielRingqvist
SAS Employee

Proc EXPLODE is great to create a bold statement, but maybe it’s a bit stiff. Why not have a look at what ODS GRAPHICS can do? The DRAWTEXT statement can draw any nice looking text you would want, and by generating a set of graphs (ODS templates actually) and then replaying them, we can make an animated image.

 

PROC EXPLODE code and result. Only allows capitals, so it's a bit limited perhaps. 



filename ft15f001 temp; options nodate pageno=1 linesize=255 pagesize=60; proc explode; parmcards; JOE BONAMASSA ;
Joe Bonamassa.png

 

 

Playing with ods graphics we can draw text, rectangles, ovals, arrows and inserting Unicode symbols. And more…

This code will create an animated GIF. Result below the code.

 

%macro setOptions;
ods _all_ close; 

/* Set options to get a large animated gif */
options 	
	papersize=('35cm', '20cm') 
	printerpath=gif 
	animation=start 
	animduration=0.5 
	animloop=yes 
	animoverlay 
	nonumber 
	nodate;

goptions 
	reset=all 
	device=gif;

ods graphics / 
	width=34cm
	height=20cm 
	imagefmt=GIF;
%mend setOptions;


%macro drawIt(text_to_draw);
%local text_to_draw_length;
%local i;
%let text_to_draw_length = %length(&text_to_draw);

/* Loop and create as many templates as the length of the parameter string. */
/* Each graph will draw 1 character longer of the parameter string.      */
%do I = 1 %to &text_to_draw_length;
proc template;
define statgraph draw_&I / store=work.gtl_explode; 
  begingraph / border=false;
    drawtext textattrs=(color=dark_orange size=72pt family='Courier New' weight=bold ) "%substr(&text_to_draw, 1, &I)" /     
    width=100 
	widthunit=percent
justify=center anchor=center ; endgraph; end; %end; ods path (prepend) WORK.gtl_explode(read); /* Replay all templates and create the animated gif */ %do I = 1 %to &text_to_draw_length; proc sgrender data=sashelp.class template=draw_&I. ; run; %end; %mend drawIt;

/* - - - - - - - - */
/* Run it */
/* - - - - - - - - */ /* Set up things */ %setOptions; /* Open ODS destination for the gif */ ods printer file='c:\temp\explode_anim.gif' style=plateau; *%drawIt(%str(Joe Bonamassa, guitar player extraordinaire!)); %drawIt(%str(Joe Bonamassa)); /* Stop and close/save gif */ options printerpath=gif animation=stop; ods printer close;

Looking like this.

 

explode_anim.gif

 

You can also insert unicode symbols which could look like this.

The code use the same macro %setOptions from the example above, so run that code first.

/* Set up things */
%setOptions;

ods printer file='c:\temp\explode_unicode.gif' style=plateau;

/* Select font below supporting the unicode symbol */
proc template;
define statgraph draw_unicode / store=work.gtl_explode; 
  begingraph / border=false;
  layout overlay;

	/* A guitar */
	entry textattrs=(color=black size=144pt family='Symbola') {unicode '01f3b8'x} / valign=top;

    drawtext textattrs=(color=dark_orange size=72pt family='Courier New' weight=bold ) "Joe Bonamassa" /     
    width=100 
	widthunit=percent
	justify=center 
	anchor=center
	;	

	/* A heart */
	entry textattrs=(color=dark_red size=144pt family='Segoe UI Symbol' weight=bold ) {unicode '2665'x} / valign=bottom;

  endlayout;
  endgraph;
end;

ods path (prepend) WORK.gtl_explode(read);

proc sgrender data=sashelp.class template=draw_unicode ;
run;

/* Stop and close/save gif */
options printerpath=gif animation=stop;
ods printer close;

A guitar and a heart added.

explode_unicode.gif

 

Read more about the Proc Template DRAWTEXT statement HERE.