SAS

SASで複数のグラフを配置する(1) ods layout

前回は評価項目ごとにグラフを出力しましたが、複数のグラフを格子状(グリッド)に配置するケースは多いと思います。
グリッド上に配置する方法はいくつか考えられますが、業務で有用な方法を検証していきます。
今回はods layout です。

ods layout gridded

ods layout griddedはods outputを二次元のグリッド上に配置することができます。
ods outputで出力されるものは何でも配置できるメリットがあります。

グリッドレイアウトにするには以下のような構文を使用します。基本的にGTLのlayout latticeと同様に
グリッドに配置したいoutputのプログラムをods layout gridded~ layout ods end ブロック内に配置するだけです。

グリッドの要素ごとにlayout regionを定義することで指定したグリッドに配置するoutputを指定できます。
advanceオプションでbygroupを指定するとby変数の値毎にoutputがグリッドに配置されます。

ods pdf file="filepath"; 
ods layout gridded columns=2 advance=bygroup; ods region; 
< procedure > ; 
ods layout end; 
ods pdf close;

以下の例ではproc sgrenderで出力した4枚のグラフを2行*2列のグリッド上に配置して出力しています。
グラフテンプレートは前回作成したものを使用しました。

options nodate nonumber nobyline; 
ods pdf file="パス"; 
ods graphics / width=9cm noborder; ods layout gridded columns=2 advance=bygroup column_gutter=0; ods region; proc sgrender data=import2 template=figure1a; by paramn param; where paramn<=4; run; ods layout end; ods pdf close;
実行結果

またグラフ以外のoutputも配置できるので、グラフと表を一緒に配置できます。これはかなり便利です。
以下の例ではグラフとそのデータの表を横に配置しています。

表はproc reportを使用して出力し、グラフと表を交互に出力するためマクロ化しています。

options papersize=a4 
orientation=landscape 
nobyline nodate nonumber; 

ods escapechar="^"; 

%macro report; 
ods pdf file="ファイルパス" ; 
ods graphics / width=12cm noborder; 

*2列のグリッドを作成; 
ods layout gridded columns=2 row_gutter=5%; 
%do i=1 %to 4; 
ods region; 

*グラフ; 
proc sgrender data=import2 template=figure1a; 
by paramn param; 
where paramn=&i.;
run; 

*テーブル テーブル用データは別途作成; 
ods region; 
  proc report data=fortable2 missing spanrows 
      style(report)={bordercolor=black borderstyle=solid borderwidth=2 frame=hsides rules=groups fontsize=8pt} 
      style(header)={asis=on backgroundcolor=white foreground=black font=('Times') fontsize=8pt}    
      style(column)={asis=on backgroundcolor=white foreground=black font=('Times') fontsize=8pt} ; 
by paramn param; 
where paramn=&i.; 

column ATPT ('^S={BorderBottomColor=black BorderBottomStyle=solid BorderBottomWidth=0.5pt}Placebo' 
       out1 ('^S={BorderBottomColor=black BorderBottomStyle=solid BorderBottomWidth=0.5pt}95% CI' 
       out2 out3)) ('^S={BorderBottomColor=black BorderBottomStyle=solid BorderBottomWidth=0.5pt}Drug XXX'   out4 ('^S={BorderBottomColor=black BorderBottomStyle=solid BorderBottomWidth=0.5pt}95% CI' 
       out5 out6)) ; 

define ATPT / order "Week"; 
define out1 / "LS mean"; 
define out2 / "Lower"; 
define out3 / "Upper"; 
define out4 / "LS mean"; 
define out5 / "Lower"; 
define out6 / "Upper"; 
run; 

%end; 

ods layout end; 
ods pdf close; 
%mend report; 

%report;
出力結果
出力結果

左にグラフ、右に表を配置できました。まあ普通に縦に並べたほうが汎用性高いですが、使い方次第では自由度の高い成果物を作成できそうです。
表やグラフをグリッド上に配置できるので、この点に関してはGTLよりも有利ですね。ただ行と列の間隔調整はできますが、
outputの出力位置の微調整はちょっとめんどくさいかも。

PDFしか使えない

これだけ見るとかなり便利そうなのですが、残念ながらPDF、PS、HTML、PowerPoint形式への出力しか対応していません。おそらく一番使われるだろうRTFは対象外です。

PSはイラストレーターを使う人であれば有用ですが、そんな人はごく一部です。比較的汎用性の高いHTMLで出力できるのが救いです。
この問題はずいぶん前から指摘されているようです。2021年現在でも全く状況は変わっていないので、今後も期待できないと思います。

結論

グラフ以外の出力も対応できる点はかなり良いですが、RTFに対応していない時点で論外です。
ods layout自体はずいぶん前から存在しているのにもかかわらず全く話題にならないのも納得です。多分使うことはないでしょう。

しかしSASはグラフィックスやレポート作成に関しては全然ユーザーのニーズを反映しませんね・・・