BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
bts
Calcite | Level 5 bts
Calcite | Level 5

Using proc gchart, I'm outputting 6 graphs per page, and will have a total of 60 pages. Unfortunatly, only the final page is being output to the PDF file. I tried using "gsfmode=append" in the goptions statement, but no luck. Appreciate any help! Thank you. 

 

 

GOPTIONS RESET=ALL ftext="Albany AMT";

ods pdf file="\\vmware-host\Shared Folders\Documents\My Documents\PreDict\Hospital Reports\macro.pdf" startpage=never ;

goptions htitle=11pt;

options nodate nonumber;

options leftmargin=0.5in rightmargin=0.5in;

 

proc gslide;

title1 "Q&i. &title" lspace=.5in f="bold";

run;quit;

 

goptions horigin=0 vorigin=6.75 hsize=3 vsize=3 htext=7pt htitle=9pt

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 140 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

 

proc gchart data=pd.griffin_collapsed_values;

     vbar &var/DISCRETE

     INSIDE=PERCENT

      G100

     GROUP=gender

      SUBGROUP=&var

     RAXIS=axis1

      maxis=axis2

      gaxis=axis3

      legend=legend1

      space=0

      width=6

     coutline=white;

where &var ne . and gender le 2;

format gender genderf. &var yesno.;

title1 "Gender" f="bold" ;

run;

quit;

 

*Bar chart #2;

 

goptions horigin=4.5 vorigin=6.75 hsize=3 vsize=3 htext=7pt htitle=9pt

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 160 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

 

proc gchart data=pd.griffin_collapsed_values;

     vbar &var/DISCRETE

     OUTSIDE=PERCENT

      G100

     GROUP=agecat_coll

      SUBGROUP=&var

     RAXIS=axis1

      maxis=axis2

      gaxis=axis3

      legend=legend1

      space=0

      width=5

     coutline=white;

where &var ne .;

format agecat_coll agec. &var yesno.;

title1 "Age Categories" f=bold;

run;

quit;

 

*Bar chart #3;

 

goptions horigin=0 vorigin=3.5 hsize=3 vsize=3 htext=7pt htitle=9pt

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 220 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

 

proc gchart data=pd.griffin_collapsed_values;

vbar &var/DISCRETE

     OUTSIDE=PERCENT

      G100

     GROUP=race_coll

      SUBGROUP=&var

     RAXIS=axis1

      maxis=axis2

      gaxis=axis3

      legend=legend1

      space=0

      width=6

     coutline=white;

where &var ne .;

format race_coll racec. &var yesno.;

title1 "Race" f=bold;

run;

quit;

 

*Bar chart #4;

 

goptions horigin=4.5 vorigin=3.5 hsize=3 vsize=3 htext=7pt htitle=9pt

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 140 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

 

proc gchart data=pd.griffin_collapsed_values;

vbar &var/DISCRETE

     OUTSIDE=PERCENT

      G100

     GROUP=edu_coll2

      SUBGROUP=&var

     RAXIS=axis1

      maxis=axis2

      gaxis=axis3

      legend=legend1

      space=0

      width=6

     coutline=white;

where &var ne .;

format edu_coll2 educc. &var yesno.;

title1 "Education" f=bold;

run;

quit;

 

*Bar chart #5;

 

goptions horigin=0 vorigin=0 hsize=3 vsize=3 htext=7pt htitle=9pt

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 220 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

 

proc gchart data=pd.griffin_collapsed_values;

vbar &var/DISCRETE

     OUTSIDE=PERCENT

      G100

     GROUP=income_coll2

      SUBGROUP=&var

     RAXIS=axis1

      maxis=axis2

      gaxis=axis3

      legend=legend1

      space=0

      width=6

     coutline=white;

where discuss_pay ne .;

format income_coll2 incc. &var yesno.;

title1 "Income" f=bold;

run;

quit;

 

*Bar chart #6;

 

goptions horigin=4.5 vorigin=0 hsize=3 vsize=3 htext=7pt htitle=9pt

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 140 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

 

proc gchart data=pd.griffin_collapsed_values;

vbar &var/DISCRETE

     OUTSIDE=PERCENT

      G100

     GROUP=employ_coll2

      SUBGROUP=&var

     RAXIS=axis1

      maxis=axis2

gaxis=axis3

      legend=legend1

      space=0

      width=5

     coutline=white;

where &var ne .;

format employ_coll2 empc. &var yesno.;

title1 "Employment" f=bold;

run;

 

quit;

ods pdf close;

 

title;

footnote;

 

%mend;

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
ballardw
Super User

If you want to stick with Gchart I suggest looking into Proc Greplay.

The general approach is that you send the output of each graph procedure to a specified graphics catalog (it helps to use a name that makes sense) with the GOUT option and using the NAME= option on each chart.

Use a TDEF statement to define a display template and save it.

 

Then use Treplay to point to the graphs created and tell the procedure which graph to place in which panel.

 

SASHELP.TEMPLT should have a number of example templates but they basically do 2 or 3 graphs stacked vertically or horizontal or 2 by 2.

If you use this approach the text in each graph gets shrunk so is a bit of a guessing game with your specific graphs.

The SG graphic procedures really are much better for attempting to place multiples on a page.

 

You might consider summarizing all of your data that use similar subgroups and add additional categorical variables to indicate the variable source and then look into SGPANEL.

View solution in original post

4 REPLIES 4
ballardw
Super User

You show a %mend without the corresponding %macro or the macro call, so we may be missing something. Also, what does the log look like? And warnings about no observations matching the where conditions? Any errors?

 

ODS LAYOUT may be easier to deal with than maintaining the offset and such and the SG procedures, SGPLOT or SGPANEL may be more appropriate.

I think you may be overwriting the graphics area as traditional SAS graphs aren't intended to stack on top of each other. Proc GREPLAY is designed to take graphs created (and saved in catalogs) and combine them into a display area specified by percent of display area. If you go this route make ALL of the graphs as you want and then use the Greplay with a "template" to do 2 by 3 or 3 by 2 displays.

bts
Calcite | Level 5 bts
Calcite | Level 5

I didn't include all the code so as to save space, but I will now. I don't get any errors (other than warnings regarding the size of the legend).

I can't seem to find any documentation on creating multiple graphs per page and multiple PDS pages.

Below is the full code. 

Thanks so much!

 

 

*Output chisquare stats datsets for each demographic variable;

 

%macro proc_code(var,i,title); *Macro each predict item;

 

ods output chisq=chia&i;

proc freq data=pd.griffin_collapsed_values;

tables &var*gender/chisq;

where &var ne . and gender=1 or gender=2;

run;

quit;

 

ods output chisq=chib&i;

proc freq data=pd.griffin_collapsed_values;

tables &var*agecat_coll/chisq;

where &var ne .;

run;

quit;

ods output chisq=chic&i;

proc freq data=pd.griffin_collapsed_values;

tables &var*race_coll/chisq;

where &var ne .;

run;

quit;

ods output chisq=chid&i;

proc freq data=pd.griffin_collapsed_values;

tables &var*edu_coll2/chisq;

where &var ne .;

run;

quit;

ods output chisq=chie&i;

proc freq data=pd.griffin_collapsed_values;

tables &var*income_coll2/chisq;

where &var ne .;

run;

quit;

ods output chisq=chif&i;

proc freq data=pd.griffin_collapsed_values;

tables &var*employ_coll2/chisq;

where &var ne .;

run;

quit;

 

 

 

*Create macro variable containing Chi-Square Results for each demographic variable;

  data _null_;set chia&i;

       format tmp $40.;

       if Statistic="Chi-Square" then do;

         tmp=put(prob,6.4);

         if prob <.001 then do;

           tmp= "<.001";

         end;

         if prob <.0001 then do;

           tmp= "<.001";

         end;

         if prob gt .001 then do;

           tmp=trim(catt(round(prob,.001)));

         end;

       tmp=catt("Chi-Square Results CHISQ","(",DF,")=",round(value,.01)," p",tmp);

%let chia&i=tmp;

       end;

   RUN;    

 

 

data _null_;

set chib&i;

       format tmp $40.;

       if Statistic="Chi-Square" then do;

         tmp=put(prob,6.4);

         if prob <.001 then do;

           tmp= "<.001";

         end;

         if prob <.0001 then do;

           tmp= "<.001";

         end;

         if prob gt .001 then do;

           tmp=trim(catt(round(prob,.001)));

         end;

       tmp=catt("Chi-Square Results CHISQ","(",DF,")=",round(value,.01)," p",tmp);

 

%let chib&i=tmp;

       end;

   RUN;    

 

data _null_;

set chic&i;

       format tmp $40.;

       if Statistic="Chi-Square" then do;

         tmp=put(prob,6.4);

         if prob <.001 then do;

           tmp= "<.001";

         end;

         if prob <.0001 then do;

           tmp= "<.001";

         end;

         if prob gt .001 then do;

           tmp=trim(catt(round(prob,.001)));

         end;

       tmp=catt("Chi-Square Results CHISQ","(",DF,")=",round(value,.01)," p",tmp);

%let chic&i=tmp;

 

       end;

   RUN;   

 

data _null_;

set chid&i;

       format tmp $40.;

       if Statistic="Chi-Square" then do;

         tmp=put(prob,6.4);

         if prob <.001 then do;

           tmp= "<.001";

         end;

         if prob <.0001 then do;

           tmp= "<.001";

         end;

         if prob gt .001 then do;

           tmp=trim(catt(round(prob,.001)));

         end;

       tmp=catt("Chi-Square Results CHISQ","(",DF,")=",round(value,.01)," p",tmp);

        %let chid&i=tmp;

 

       end;

   RUN; 

 

data _null_;

set chie&i;

       format tmp $40.;

       if Statistic="Chi-Square" then do;

         tmp=put(prob,6.4);

         if prob <.001 then do;

           tmp= "<.001";

         end;

         if prob <.0001 then do;

           tmp= "<.001";

         end;

         if prob gt .001 then do;

           tmp=trim(catt(round(prob,.001)));

         end;

       tmp=catt("Chi-Square Results CHISQ","(",DF,")=",round(value,.01)," p",tmp);

       %let chie&i=tmp;

       end;

   RUN;    

 

data _null_;

set chif&i;

       format tmp $40.;

       if Statistic="Chi-Square" then do;

         tmp=put(prob,6.4);

         if prob <.001 then do;

           tmp= "<.001";

         end;

         if prob <.0001 then do;

           tmp= "<.001";

         end;

         if prob gt .001 then do;

           tmp=trim(catt(round(prob,.001)));

         end;

       tmp=catt("Chi-Square Results CHISQ","(",DF,")=",round(value,.01)," p",tmp);

       %let chif&i=tmp;

 

       end;

   RUN;

 

 

 

 

 

***************************************************************************;

 

 

GOPTIONS RESET=ALL ftext="Albany AMT";

ods pdf file="\\vmware-host\Shared Folders\Documents\My Documents\PreDict\Hospital Reports\macro.pdf" startpage=never ;

goptions htitle=11pt;

options nodate nonumber;

options leftmargin=0.5in rightmargin=0.5in; 

proc gslide;

title1 "Q&i. &title"  lspace=.5in f="bold";

run;quit;

 

 

 

goptions horigin=0 vorigin=6.75 hsize=3 vsize=3 htext=7pt htitle=9pt ftitle="bold" gsfmode=append;

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 140 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

pattern1 v=solid color=CX93BFBF;

pattern2 v=solid color=CX4791ED;

 

   proc gchart data=pd.griffin_collapsed_values;

       vbar &var/DISCRETE

       INSIDE=PERCENT

  G100

       GROUP=gender

  SUBGROUP=&var

       RAXIS=axis1

  maxis=axis2

  gaxis=axis3

legend=legend1

space=0

width=6

  coutline=white;

where &var ne . and gender le 2;

format gender genderf. &var yesno.;

title1 "Gender" f="bold" ;

*footnote1 j=c h=.75 f=Albany "Figure a&i. &chia&i";

    run;

    quit;

 

 

*Bar chart #2;

 

goptions horigin=4.5 vorigin=6.75 hsize=3 vsize=3 htext=7pt htitle=9pt ftitle="bold" gsfmode=append;

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 160 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

pattern1 v=solid color=CX93BFBF;

pattern2 v=solid color=CX4791ED;

 

proc gchart data=pd.griffin_collapsed_values;

       vbar &var/DISCRETE

       OUTSIDE=PERCENT

  G100

       GROUP=agecat_coll

  SUBGROUP=&var

       RAXIS=axis1

  maxis=axis2

  gaxis=axis3

legend=legend1

space=0

width=5

  coutline=white;

where &var ne .;

format agecat_coll agec. &var yesno.;

title1 "Age Categories" f=bold;

*footnote1 j=c h=.75 f=Albany "Figure b&i. &chib&i";

    run;

    quit;

 

*Bar chart #3;

 

goptions horigin=0 vorigin=3.5 hsize=3 vsize=3 htext=7pt htitle=9pt ftitle="bold" gsfmode=append;

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 220 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

pattern1 v=solid color=CX93BFBF;

pattern2 v=solid color=CX4791ED;

 

proc gchart data=pd.griffin_collapsed_values;

       vbar &var/DISCRETE

       OUTSIDE=PERCENT

  G100

       GROUP=race_coll

  SUBGROUP=&var

       RAXIS=axis1

  maxis=axis2

  gaxis=axis3

legend=legend1

space=0

width=6

  coutline=white;

where &var ne .;

format race_coll racec. &var yesno.;

title1 "Race" f=bold;

*footnote1 j=c h=.75 f=Albany "Figure c&i. &chic&i";

    run;

    quit;

 

*Bar chart #4;

 

goptions horigin=4.5 vorigin=3.5 hsize=3 vsize=3 htext=7pt htitle=9pt ftitle="bold" gsfmode=append;

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 140 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

pattern1 v=solid color=CX93BFBF;

pattern2 v=solid color=CX4791ED;

 

proc gchart data=pd.griffin_collapsed_values;

       vbar &var/DISCRETE

       OUTSIDE=PERCENT

  G100

       GROUP=edu_coll2

  SUBGROUP=&var

       RAXIS=axis1

  maxis=axis2

  gaxis=axis3

legend=legend1

space=0

width=6

  coutline=white;

where &var ne .;

format edu_coll2 educc. &var yesno.;

title1 "Education" f=bold;

*footnote1 j=c h=.75 f=Albany "Figure d&i. &chid&i";

    run;

    quit;

 

*Bar chart #5;

 

goptions horigin=0 vorigin=0 hsize=3 vsize=3 htext=7pt htitle=9pt ftitle="bold" gsfmode=append;

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 220 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

pattern1 v=solid color=CX93BFBF;

pattern2 v=solid color=CX4791ED;

 

proc gchart data=pd.griffin_collapsed_values;

       vbar &var/DISCRETE

       OUTSIDE=PERCENT

  G100

       GROUP=income_coll2

  SUBGROUP=&var

       RAXIS=axis1

  maxis=axis2

  gaxis=axis3

legend=legend1

space=0

width=6

  coutline=white;

where discuss_pay ne .;

format income_coll2 incc. &var yesno.;

title1 "Income" f=bold;

*footnote1 j=c h=.75 f=Albany "Figure e&i. &chie&i";

    run;

    quit;

 

*Bar chart #6;

 

goptions horigin=4.5 vorigin=0 hsize=3 vsize=3 htext=7pt htitle=9pt ftitle="bold" gsfmode=append;

axis1 label=(a=90 f="Albany AMT" "Frequency") order=(0 to 140 by 20) minor=none;

axis2 label=none value=none;

axis3 label=none ;

legend1

label=("Response" h=2 pt position=left j=c)

position=(top inside left) mode=share

value=(h=5 pt 'Yes' 'No');

pattern1 v=solid color=CX93BFBF;

pattern2 v=solid color=CX4791ED;

 

proc gchart data=pd.griffin_collapsed_values;

       vbar &var/DISCRETE

       OUTSIDE=PERCENT

  G100

       GROUP=employ_coll2

  SUBGROUP=&var

       RAXIS=axis1

  maxis=axis2

  gaxis=axis3

legend=legend1

space=0

width=5

  coutline=white;

where &var ne .;

format employ_coll2 empc. &var yesno.;

title1 "Employment" f=bold;

*footnote1 j=c h=.75 f=Albany "Figure f&i. &chif&i";

    run;

    quit;

ods pdf close;

 

title;

footnote;

 

%mend;

 

 

%proc_code( discuss_pay,1,Hospital personnel came to my room to discuss payment );

%proc_code( doc_language,2,All hospital documents were available in the language I prefer to read );

%proc_code( undstd_docs,3,I understood all the documents I was asked to sign );

%proc_code( undstd_role,4,I understood the role of all hospital personnel entering my room );

%proc_code( questions_hosp,5, Someone explained what I should do if I had questions after leaving the hospital);

%proc_code( comf_read_write,6,Someone asked me how comfortable I am reading and writing in English );

%proc_code( mt_affordmeds,7,A doctor asked me if I could afford my discharge medication );

%proc_code( mt_DNR,8,A doctor and I talked about whether I would want them to try to save me if my heart stopped );

%proc_code( mt_responsib,9,A doctor asked me if I had any responsibilities that would make me need to leave the hospital as soon as possible (for example, child care, work) );

%proc_code( mt_negcom,10, I heard the doctors make negative comments about me);

%proc_code( nt_negcom,11, I heard the nurses make negative comments about me);

%proc_code( ss_negcom,12,I heard the support staff make negative comments about me );

%proc_code( mt_follow_dcins,13,The doctors asked if my day-to-day routine would prevent me from following their discharge care instructions );

%proc_code( mt_takemed,14, The doctors asked if I was taking my medication regularly before coming to the hospital);

%proc_code( mt_fakesymp,15,The doctors told me I was exaggerating or faking my symptoms );

%proc_code( hosp_rules,16,My friends and family had trouble seeing me because of hospital rules );

%proc_code( ss_unattended,17,I was left unattended for a long time when I was taken to have a test );

%proc_code( mt_seniorphys,18,The senior/attending doctor came to see me every day );

 

 

ballardw
Super User

If you want to stick with Gchart I suggest looking into Proc Greplay.

The general approach is that you send the output of each graph procedure to a specified graphics catalog (it helps to use a name that makes sense) with the GOUT option and using the NAME= option on each chart.

Use a TDEF statement to define a display template and save it.

 

Then use Treplay to point to the graphs created and tell the procedure which graph to place in which panel.

 

SASHELP.TEMPLT should have a number of example templates but they basically do 2 or 3 graphs stacked vertically or horizontal or 2 by 2.

If you use this approach the text in each graph gets shrunk so is a bit of a guessing game with your specific graphs.

The SG graphic procedures really are much better for attempting to place multiples on a page.

 

You might consider summarizing all of your data that use similar subgroups and add additional categorical variables to indicate the variable source and then look into SGPANEL.

bts
Calcite | Level 5 bts
Calcite | Level 5

Do you have any examples on using proc sgplot for outputting multiple pages in PDF? I can't seem to find any... Thank you!

sas-innovate-2024.png

Today is the last day to save with the early bird rate! Register today for just $695 - $100 off the standard rate.

 

Plus, pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 4 replies
  • 1768 views
  • 0 likes
  • 2 in conversation