proc format; value group 9='< 5' 8='5-10' 7='11-15' 6='16-20' 5='21-25' 4='26-30' 3='31-35' 2='35 +' 1='Total'; run; data _null_; format y group.; pi=3.1415; length x y 8; retain yo 1 ymin 1e10 ymax -1e10; drop pi yo ymin ymax; /*--Declare the Hash Object--*/ declare hash h(ordered:'a'); declare hiter iter('h'); rc=h.defineKey('x'); rc=h.defineData('x', 'y', 'group'); rc=h.defineDone(); do group = 1 to 9; h.clear(); phase=ranuni(2); do x=0 to pi/2.0 by 0.02; y=sin(x+phase)+0.5*ranuni(2); rc=h.add(); ymin=min(ymin, y); ymax=max(ymax, y); end; yrange=ymax-ymin; count=h.num_items; rc=iter.first(); do i=1 to count; y=0.9*(y-ymin)/yrange - 0.45 + yo; h.replace(); rc=iter.next(); end; h.output (dataset:'spark_'|| put (group, 1.0)); yo = yo+1; end; run; data spark; set spark_1 spark_2 spark_3 spark_4 spark_5 spark_6 spark_7 spark_8 spark_9; run; data stats; input group2 Y2008 Y2009; if mod(_n_, 2) ne 0 then ref=group2; format mean sum 2.0; y2008label='2008'; y2009label='2009'; datalines; 1 22 56 2 25 60 3 19 45 4 16 32 5 27 64 6 22 56 7 25 60 8 19 45 9 16 32 ; run; proc print;run; data all; set spark stats; run; proc print label;run; proc template; define statgraph spark; begingraph / designwidth=6in designheight=3in; entrytitle 'How many people are unemployed and for how long'; layout lattice / columns=3 columnweights=(0.8 0.10 0.10) rowdatarange=union border=false; rowaxes; rowaxis / display=(tickvalues) offsetmin=0.05 offsetmax=0.05 linearopts=(tickvaluesequence=(start=1 end=9 increment=1)); endrowaxes; layout overlay / walldisplay=(fill) yaxisopts=(display=none offsetmin=0.05 offsetmax=0.05 linearopts=(tickvaluesequence=(start=1 end=9 increment=1))) x2axisopts=(label='Unemployment Trend' display=(label)); seriesplot x=x y=y / group=group lineattrs=(pattern=solid) xaxis=x2 lineattrs=graphdatadefault; referenceline y=ref / lineattrs=(thickness=25) datatransparency=0.85; endlayout; layout overlay / walldisplay=(fill) x2axisopts=(label='2008' display=(label)); scatterplot y=group2 x=y2008label / markercharacter=y2008 xaxis=x2; referenceline y=ref / lineattrs=(thickness=25) datatransparency=0.85; endlayout; layout overlay / walldisplay=(fill) x2axisopts=(label='2009' display=(label)); scatterplot y=group2 x=y2009label / markercharacter=y2009 xaxis=x2; referenceline y=ref / lineattrs=(thickness=25) datatransparency=0.85; endlayout; endlayout; endgraph; end; run; ods listing; ods graphics / reset imagename='Spark' antialiasmax=1000; proc sgrender data=all template=spark; run;