SAS

layoutステートメントを使いこなす(3) Data-driven layout

グラフを複数配置するケースとして、クラス変数ごとにデータのサブセットを作成し、各サブセットごとにグラフを作成することがあります。
しかしGRIDDEDレイアウトやLATTICEレイアウトではグラフを一つ一つ定義しなければならないため大変です。GTLにはこのような作図を簡単にできるレイアウトが用意されています。

Data-Driven レイアウト

Data-drivenレイアウトはクラス変数に基づいてデータのサブセットを作成し、各サブセットのグラフを配置します。sgpanelプロシジャやsgplotのpanelbyステートメントとほぼ同じ作図ができます。

DATALATTICEレイアウト

クラス変数を1つまたは2つ指定してクラス変数の組み合わせごとにグラフを作成します。LATTICEレイアウトとは異なりCELLブロックではなくPROTOTYPEレイアウトを使用します。クラス変数に基づいて作成されたデータのサブセットはPROTOTYPEレイアウト内でグラフ化されます。

DATALATTICEの内部に設置できるのはPROTOTYPEレイアウトとSIDEBARブロックのみです。

クラス変数はCOLUMNVARまたはROWVARで指定します。

以下の例ではIRISデータを使って種毎にあやめのがくの幅と長さをプロットしています。グラフを横に並べるために変数SpeciesをColumnvarに指定しています。

proc template; 
define statgraph datalattice;
begingraph;

layout datalattice columnvar=Species/
       headerlabeldisplay=value 
       columnaxisopts=(griddisplay=on)
       rowaxisopts=(griddisplay=on);

   layout prototype;
      scatterplot x=SepalLength y=SepalWidth;
   endlayout;

endlayout;
endgraph;
end;
run;

proc sgrender data=sashelp.iris template=datalattice;
run;

実行結果

グラフ内部に統計量テーブルを挿入する

Insetオプションを指定することでグラフの内部に指定した変数の値を表示させることができます。
以下の例では種毎にあやめのがくの幅と長さをプロットし、さらに幅と長さの平均値をグラフ内部に表示させています。

まずSummayプロシジャで種毎にがくの幅と長さの平均値を算出し、それを作図データセットをマージしています。

この時マージキーは指定せずに単純に横結合するのがポイントです。insetオプションではクラス変数に基づくサブセットから指定した変数を読み込んでいるのではなく、作図データセットをそのまま上から1行ずつ読み込んでいるようです。そのため統計量と作図データのソート順には気をつけないといけませんね。

なおデフォルトではクラス変数のデータの順番に従ってプロットされます。

proc summary data=sashelp.iris ;
class Species;
var SepalWidth SepalLength;
output out=DS1(where=(_TYPE_ ^= 0))
       MEAN(SepalWidth)=Mean_width
       MEAN(SepalLength)=Mean_length ;
run;

data DS2;

merge sashelp.iris 
      DS1(keep=Mean_width Mean_length);

attrib _ALL_ label=" ";
run;

proc template;
define statgraph datalattice;
begingraph; 

layout datalattice columnvar=Species/
       headerlabeldisplay=value
       columnaxisopts=(griddisplay=on)
       rowaxisopts=(griddisplay=on)
       inset=(Mean_width Mean_length)
       insetopts=(border=true textattrs=(size=8)
                  autoalign=(bottomright bottomleft));

   layout prototype;
      scatterplot x=SepalLength y=SepalWidth;
   endlayout;

endlayout;
endgraph;
end;
run;

proc sgrender data=DS2 template=datalattice;
run;

実行結果

DATAPANELレイアウト

DATALATTICEレイアウトと異なりクラス変数を2つ以上指定できます。