Skip to main content

Getting higher quality default graphs in SAS

Objective: I am running a statistical analysis in SAS, and the default ODS graphics look good, but I need them to be publication quality.

SAS can automatically create some nice graphs, and has greatly increased the availability of graphs within procedures.  If you like what you see, you might copy graphs directly from the SAS output window, or possibly you save graphs and output to a pdf or other external file format.  But this output will be low quality, generally 75 dpi.  Instead, add the following statements to write graphics directly to files, allowing control of format and quality.
ods graphics on /
      width=7in
      imagefmt=tiff
      imagemap=off
      imagename="MyPlot"
      border=off;

ods listing file="Body.rtf" style=journal gpath="."  dpi=600;

Once these statements have been submitted, all graphs created by subsequent procedures will be written  to files named MyPlotxx.tiff, where xx will be sequential numbers.  The tiff option can be changed to other formats, such as jpeg or png.  The dpi option controls the quality, with a typical graph file created by the above being around 38Meg, instead of the default 70 KB.  Use png to get a more reasonably sized graph (200KB) without the compression fuzziness of jpeg.  Gpath states where the files will be written, the dot here says use the current working directory (displayed in the lower right margin of the SAS window).  Note that tiff output is not supported by html or rtf ODS destinations, so listing is used.
To cancel these options, you need to reset the graphics options, and close the output file so the dpi option is removed (or set it to 100), for example
ods graphics on/reset;
ods listing close;
ods html ;
Another option used above, style=journal instead of the default style=htmlblue is an easy way to get black and white graphs.

Default configuration of SAS does not allow large graphs, so you are likely to get no graphs, and the following errors in SAS log:
WARNING: A very large output size of (4000, 3000) is in effect. This could make Java VM run out of memory and result in some Java exceptions. You should reduce the output size or DPI settings.
ERROR: Java virtual machine exception. java.lang.OutOfMemoryError: Java heap space.
To fix these, go to your config.sas file, usually located (Windows) in
     C:\Program Files\SASHome\SASFoundation\9.4\nls\en
Location varies depending on 32 vs 64 bit, the 9.4 version, and the en language.  The plain text file is sasv9.cfg, so use an editor like Notepad to find these lines
        -Xms128m
        -Xmx128m
and change them to
        -Xms1028m
        -Xmx1028m
Reload SAS to activate the changes, and dpi of at least 600 should be possible.

Example:  Run this SAS program to get low and high quality graphs.  If you zoom each graph, the low quality is clearly much fuzzier.

data one;
 label x="First Score"
  y="Last Score";
 do rep=1 to 20;
  y=10+rannor(10);
  x=y+rannor(20)*3;
  output;
 end;
run;

ods graphics on / 
      width=7in  
      imagefmt=png
      imagemap=off
      imagename="MyPlot"
      border=off;

ods html file="Body.html" style=journal gpath="."  dpi=100;

proc corr data=one plots=scatter;
 var x; with y;
run;

ods html file="Body.html" style=journal gpath="."  dpi=600;

proc corr data=one plots=scatter;
 var x; with y;
run;




Comments

Popular posts from this blog

Reporting results from transformed analyses

Objective :  Transformed data, for example log(y), is analyzed to correct normality or equal variance requirements.  But we want to report means and standard errors in the original units. SAS example : data one;  do treat=1 to 3;  do rep=1 to 5;    y=10 + treat+ exp(rannor(111));    logy=log(y);    output;  end;end; run; proc mixed plots=all;   class treat;   model y=treat;   lsmeans treat/pdiff; run; proc mixed plots=all;   class treat;   model logy=treat;   lsmeans treat/pdiff; run; The original data, variable y, might have units of pounds.  If a transformation is needed, we simply calculate a new variable by applying a mathematical function known to improve normality or equal variance, and run the same analysis on the new variable.  Commonly used choices are listed in the second table below. However, looking at the results for both analyses we see treat Mean Y S...

DANDA - A macro collection for easier SAS statistical analysis

Objective :  You are running ANOVAs or regressions in SAS, and wish there was a way to avoid writing the dozens of commands needed to conduct the analysis and generate recommended diagnostics and summary of results, not to mention the hundreds of possible options that might be needed to access recommended methods.  A possible solution is to download a copy of danda.sas below, and use this macro collection to run the dozens of commands with one statement.  We will also have future posts covering various uses of danda.sas, giving examples as always. danda.sas is under continued development, check this page for updates. Date                       Version               Link 2021/03/15             2.12.030          danda.sas 2021/03/15       ...

Estimation of the Peak in Quadratic Regression

 Problem:   You are running a standard quadratic (polynomial) regression analysis, and are specifically interested in the X and Y values at the peak.  If you use standard regression software, typically there will be no option that allows the peak to be estimated, with standard errors. Example:   You are studying Growth as a function of Age.  Of particular interest is when maximum Growth occurs, and at what Age. SAS code to generate artificial data, and run the analysis is: data one; do Age=1 to 20; Growth=95 + 2.7*Age - .3*Age*Age + 5*rannor(22); end; proc nlin plots=fit; parms int=2 lin=1 quad=1; model Growth = int + lin*Age + quad*Age*Age; estimate 'Age at peak' -lin/(2*quad); estimate 'Growth at peak' int + lin*(-lin/(2*quad)) + quad*(-lin/(2*quad))*(-lin/(2*quad)); run; The standard quadratic regression model with intercept, linear and quadratic slopes, is coded into Proc NLIN which has the ability to estimate any fun...