SAS

GTLで棒グラフを作図する

GTLで棒グラフを作図する場合はbarchartステートメントかbarchartparmステートメントを使用します。

両者の違いは以前の記事を見てください。

barchartステートメント

カテゴリ変数と応答変数を指定して棒グラフを作成します。

barchartparmステートメントを使用する場合は、カテゴリ変数の値は重複がないようにしなければなりません。barchartステートメントを使用する場合はstatオプションで作図する統計量を指定しましょう。

エラーバーを表示したい場合はerrorlowerとerrorupperオプションでエラーバー下限と上限の変数をします。

棒グラフの向きはorientオプションで指定します。

棒グラフを縦方向に作図する場合、カテゴリ変数はX軸(横軸)で、応答変数はY軸(縦軸)となります。棒グラフを横方向に作図する場合は逆になります。

SAS9.4M3以前はカテゴリ軸は離散変数軸しか選べませんでしたが、M3以降は線形、対数、および時系列軸を選択できるようになりました。

クラスター表示

groupオプションを指定すると指定した変数ごとに棒グラフを作成できます。棒グラフの配置方法はclusterとstackedがあり、groupdisplayオプションで指定できます。

試しに以下のデータを作図してみます。まずはクラスター表示

catlevelmeanlowerupper
グループ17.06.57.5
グループ29.28.79.7
グループ311.911.412.4
グループ45.75.26.2
グループ515.214.715.7
グループ114.614.115.1
グループ217.817.318.3
グループ32.92.43.4
グループ45.34.85.8
グループ59.59.010.0
proc template;
define statgraph bar;
begingraph;
   layout overlay;
      barchartparm category=cat response=mean /
         name="bar"
         group=level
         groupdisplay=cluster
         errorlower=lower
         errorupper=upper
         errorbarattrs=(color=black);
      discretelegend "bar";
   endlayout;
endgraph;
end;
run;
実行結果(クラスター表示)

ちなみにorient=horizontalを指定して横方向に配置するとこんな感じ

実行結果(クラスター、横向き)

積み上げ棒グラフ

groupdisplay=stackにするといわゆる積み上げ棒グラフとなります。当然ですがこの表示の場合エラーバーは表示できません。

proc template;
define statgraph bar;
begingraph;
   layout overlay;
      barchartparm category=cat response=mean /
         name="bar"
         group=level
         groupdisplay=stack;
      discretelegend "bar";
   endlayout;
endgraph;
end;
run;
実行結果(積み上げ棒グラフ)

積み上げ棒グラフの場合、度数ではなくパーセントを表示することが多いです。GTLでパーセント積み上げグラフを作図する場合は、あらかじめ比率を算出して作図するのも手ですが、group100オプションでmagnitudeを指定すると、各カテゴリごとに自動で標準化してくれます。

magnitudeは負の値も許容しますが、positveを指定すると負の値はプロットされません。

proc template;
define statgraph bar;
begingraph;
   layout overlay;
      barchartparm category=cat response=mean /
         name="bar"
         group=level
         groupdisplay=stack
         group100=magnitude;
      discretelegend "bar";
   endlayout;
endgraph;
end;
run;

実行結果(パーセント積み上げグラフ)

各カテゴリのグループの合計は必ず100%になりますので、各グループがカテゴリ全体に占める割合の違いを把握しやすくなります。

セグメントラベルを表示する

セグメントラベルはバーの内部に表示するラベルです。

セグメントラベルは各グループの応答変数の値を表示します。ただし任意の変数の値を表示することはできません。
セグメントラベルはsegmentlabeltype=autoにすると表示できます。またsegmentlabelformatオプションでラベルのフォーマットを、segmentlabelattrsオプションでラベルの表示設定を設定できます。

ods output CrossTabFreqs=stat;
proc freq data=sashelp.cars;
   tables origin*type;
run;

proc template;
define statgraph barchart;
begingraph / attrpriority=none;
entrytitle "Percentage of Total Models by Type and Origin";
   layout overlay;
      barchartparm x=type response=colpercent /
         name="carmodels"
         group=origin
         groupdisplay=stack
         segmentlabeltype=auto
         segmentlabelformat=5.1
         segmentlabelattrs=(color=white size=12);
      discretelegend "carmodels";
   endlayout;
endgraph;
end;
run;

proc sgrender data=stat template=barchart;
label colpercent="Percent";
where origin^="" and colpercent^=.;
run;

実行結果

データラベルを表示する

データラベルは棒の末端に表示するラベルです。

groupdisplay=clusterの場合のみ有効となります。データラベルは任意の変数を指定することが可能です。
表示するにはdatalabelオプションでラベル変数を指定します。あるいはdatalabeltype=autoにすることで応答変数の値を表示することができます。

datalabelattrsでデータラベルの表示設定を指定できます。

proc freq data=sashelp.cars;
   tables type / out=stat;
run;

proc template;
define statgraph barchart2;
begingraph / attrpriority=none;
   layout overlay;
      barchartparm x=type response=count /
         name="carmodels"
         datalabel=count
         datalabelattrs=(size=12 color=red);
      discretelegend "carmodels";
   endlayout;
endgraph;
end;
run;

proc sgrender data=stat template=barchart2;
run;

実行結果