Looks like pulling a 2-column for only a part of page rather than whole is doable through ODS RTF. However, I'm lost on where would be good spots to wedge in ODS RTF COLUMNS=1 and ODS RTF COLUMNS=2 to put together only the table and chart side-to-side. Any idea?
%let outsy=E:\Users\pete\Desktop\qb;
data qbdats;
input QB $ completed passes;
datalines;
Brett 23 35
Tom 21 29
Peyton 34 41
Eli 32 37
Aaron 26 38
;
run;
/* at this point main this is basically adding the _type_
variable but would be appropriate if your data was
per game or similar
A GROUP variable creates a stacked barchart with
separate colors for each level. If you only have
on value for a group it stands out as desired.
*/
proc summary data=qbdats;
class QB;
var completed passes;
output out=qbsums sum=;
run;
data qb_pass_rate;
set qbsums;
completion_rate = completed/passes ;
if missing(QB) then QB='Total';
run;
data attrmap;
/* The ID required variable contains the name of the attribute map */
/* The VALUE required variable contains the value of the GROUP variable,
which in this case is BARTYPE */
/* The FILLCOLOR variable is used to change the color for the bars created by the VBAR
statement. */
input id $ value fillcolor $;
datalines;
_type_ 0 green
_type_ 1 blue
;
run;
%let defaulttablefont=font_face=Calibri fontsize=10pt;
ods noresults escapechar='^';
%let bc=cx7BA0CD;
%let bw=1;
%let breaklinesandwich=borderbottomcolor=&bc borderbottomwidth=&bw.pt bordertopcolor=&bc bordertopwidth=&bw.pt;
/*%let boxy=borderwidth=&bw.pt bordercolor=&bc;*/
%let titlestyle=borderwidth=&bw.pt bordercolor=&bc font_face=Calibri fontsize=12pt fontweight=bold background=cxD3DFEE;
ods path sasuser.templat(UPDATE)
mylib.templat (READ)
sashelp.tmplmst(READ);
proc template;
define style styles.test1;
parent=styles.rtf;
style fonts /
'TitleFont' = ("Arial",16pt)
'TitleFont2' = ("Arial",16pt)
'StrongFont' = ("<MTserif>, Times Roman",10pt,bold)
'EmphasisFont' = ("Calibri",10pt,bold)
'FixedEmphasisFont' = ("<MTmonospace>, Courier",9pt,italic)
'FixedStrongFont' = ("<MTmonospace>, Courier",9pt,bold)
'BatchFixedFont' = ("SAS Monospace, <MTmonospace>, Courier",6.7pt)
'FixedFont' = ("<MTmonospace>, Courier",9pt)
'headingFont' = ("<MTserif>, Times Roman",11pt,bold)
'docFont'=("Calibri",10pt)
;
style GraphFonts /
'NodeDetailFont' = ("<MTserif>, <serif>",7pt)
'NodeInputLabelFont' = ("<MTserif>, <serif>",9pt)
'NodeLabelFont' = ("<MTserif>, <serif>",9pt)
'NodeTitleFont' = ("<MTserif>, <serif>",9pt)
'GraphDataFont' = ("Calibri",10pt,bold)
'GraphUnicodeFont' = ("<MTserif-unicode>",9pt)
'GraphValueFont' = ("Calibri",16pt)
'GraphLabel2Font' = ("Calibri",10pt)
'GraphLabelFont' = ("Calibri",10pt,bold)
'GraphFootnoteFont' = ("<MTserif>, <serif>",10pt)
'GraphTitleFont' = ("<MTserif>, <serif>",11pt,bold)
'GraphTitle1Font' = ("<MTserif>, <serif>",14pt,bold)
'GraphAnnoFont' = ("Calibri",10pt)
;
/* class TitlesAndFooters /*/
/* font = Fonts('TitleFont2')*/
/* backgroundcolor = colors('systitlebg')*/
/* color = colors('systitlefg')*/
/* ;*/
style systemtitle from TitlesAndFooters /
just=left
vjust=bottom
;
style Body from Document /
marginbottom = 0.5in
margintop = 1in
marginright = 1in
marginleft = 1in;
style Table from Output /
/* bordercollapse = separate*/
rules = ALL
cellpadding = 1pt
bordercolor=cx7BA0CD
borderwidth=2pt
borderstyle = solid
/* font=fonts('docFont')*/
;
style header from table /
just=center
vjust=middle
fontweight=bold
background=white
borderbottomcolor=cx7BA0CD
borderbottomwidth=2pt
paddingleft=5pt
paddingright=5pt
;
class cell /
paddingleft=5pt
paddingright=5pt
;
class graph /
just=left;
end;
run;
ods rtf file="&outsy\qb_stats.rtf" style=styles.test1 startpage=no;
options nocenter nonumber nodate;
title "HEADER TEST";
ods rtf text="^{newline}^{style[font_face=Calibri fontsize=11pt &breaklinesandwich]This report provides a
summary of data collected for the QB passes in football. The task was issued to Pete in XXX game(s).}^{newline}";
ods rtf text="^{newline}";
ods rtf text="^S={outputwidth=100% &titlestyle}TEST TITLE 1: QB STATS";
ods rtf columns=1;
ods rtf columns=2;
PROC REPORT DATA = qb_pass_rate(where=(qb^='Total')) MISSING nowd
STYLE(REPORT)=[BACKGROUND=WHITE ASIS=ON just=l frame=box]
/* style(column)=[&defaulttablefont]*/
style(summary)=[bordertopcolor=cx7BA0CD bordertopwidth=2pt]
;
COLUMN QB Completed passes pctComp;
COMPUTE qb;
COUNT+1;
IF (MOD(COUNT,2)) THEN CALL DEFINE (_ROW_, 'STYLE', 'STYLE=[BACKGROUND=cxD3DFEE]');
IF _BREAK_="_RBREAK_" THEN qb = 'Total';
ENDCOMP;
DEFINE qb / "QB" ORDER=data;
DEFINE Completed / "# caught" center format=comma.;
DEFINE passes / "# of passes" center format=comma.;
define pctComp / "Pass Completion Rate (%)" computed center format=percent8.2;
compute pctComp;
pctComp=completed.sum/passes.sum;
endcomp;
RBREAK AFTER / SUMMARIZE;
RUN;
ods rtf columns=1;
ods graphics on / width=3.5in height=2.5in;
/*ods graphics / reset=index imagename='barchart1' imagefmt=jpg;*/
/*ods graphics / width=3.5in height=2.5in reset=index imagename='barchart1' imagefmt=jpg;*/
/*ods listing gpath="&outsy";*/
proc sgplot data= qb_pass_rate dattrmap=attrmap noautolegend;
title; footnote;
xaxis label = 'QB'
/* labelattrs=(Family=Calibri Size=10 Weight=bold)*/
type=discrete discreteorder=data display=(noticks);
yaxis label='Pass Completion Rate (%)'
/* labelattrs=(Family=Calibri Size=10 Weight=bold)*/
tickvalueformat=percent6. grid gridattrs=(color=gray pattern=solid thickness=1);
vbar qb / response= completion_rate group=_type_ attrid=_type_ datalabel;* datalabelattrs=(weight=bold);
format completion_rate percent8.2;
run;
ods rtf text="^S={outputwidth=100% &titlestyle}TEST TITLE 2: BLABLABLA";
ods rtf text="^{unicode '25cf'x} ^{style[font_face=Calibri fontsize=11pt]blablabla1}";
ods rtf text="^{unicode '25cf'x} ^{style[font_face=Calibri fontsize=11pt]blablabla2}";
ods rtf text="^{unicode '25cf'x} ^{style[font_face=Calibri fontsize=11pt]blablabla3}";
/*ods graphics off;*/
/*ods listing close;*/
/*ods rtf columns=1;*/
ods rtf close;
ods _all_ close;
When you refer to the attached RTF, I sort of managed to make a selective 2-column section.
... View more