SGPLOTプロシジャに「TMPLOUT=オプション」をつけると、TEMPLATEプロシジャのコードを自動生成してくれます。
- 自動生成されるコードの出力先を「TMPLOUT=」にtxt形式等でフルパスで指定する。
- 生成されるコードの中身は環境によって少し異なる。あと後述しますが注意点あり
proc sgplot data=SASHELP.FISH tmplout="出力先をフルパス指定" ;
hbox WEIGHT / category=SPECIES; run; |
自動生成されたコード
proc template; define statgraph sgplot; dynamic _ticklist_; begingraph / collation=binary; layout overlay / yaxisopts=(labelFitPolicy=Split) y2axisopts=(labelFitPolicy=Split) yaxisopts=(discreteOpts=(sortOrder=ascendingFormatted)) yaxisopts=(type=Discrete reverse=true discreteOpts=(tickValueList=_ticklist_ tickValueListPolicy=Union)) y2axisopts=(discreteOpts=(sortOrder=ascendingFormatted)) y2axisopts=(type=Discrete reverse=true discreteOpts=(tickValueList=_ticklist_ tickValueListPolicy=Union)); BoxPlot X='Species'n Y='Weight'n / primary=true orient=horizontal LegendLabel="Weight" NAME="HBOX"; endlayout; endgraph; end; run; |
💬 注意点
例えば、以下のSGPLOTからTEMPLATEプロシジャのコードを自動生成すると、、
proc sgplot data=SASHELP.CLASS tmplout="出力先をフルパス指定" ; vbar SEX; run; |
proc template; define statgraph sgplot; dynamic _NEGATIVE_; dynamic _ticklist_; begingraph / collation=binary; layout overlay / yaxisopts=(labelFitPolicy=Split) y2axisopts=(labelFitPolicy=Split) xaxisopts=(type=Discrete discreteOpts=(tickValueList=_ticklist_ tickvaluefitpolicy=SplitRotate tickValueListPolicy=Union)) x2axisopts=(type=Discrete discreteOpts=(tickValueList=_ticklist_ tickvaluefitpolicy=SplitRotate tickValueListPolicy=Union)) yaxisopts=(linearopts=(Integer=true)); BarChartParm X='Sex'n Y=_FREQUENCY_ / primary=true LegendLabel="度数" NAME="VBAR"; endlayout; endgraph; end; run; |
自動生成されたコードの青文字で示した部分に注目!
プロットに使用したデータセット「SASHELP.CLASS」には「_FREQUENCY_」なんて変数はないし、DYNAMICステートメントにも「_FREQUENCY_」なんていうDYNAMIC変数は定義されていません。
ナニコレ??
どうやら、グラフに含まれる要約値(今回の場合は度数)は、自分で計算しないといけない場合があるようです。
例えば今回の場合では、以下のような対応が必要
- SEXごとの度数をPROC FREQとかで求めてデータセットに出力
- 自動生成されたコードの「Y=_FREQUENCY_」の部分を「Y=自分で求めた度数が入った変数」に置き換える
- SGRENDERでは上記で作成したデータセットを使用する
まとめ
SGPLOTでは不可能なカスタマイズをしたい場合にTEMPLATEプロシジャを使いますが、TMPLOUT=オプションでコードを自動生成してしまえば、自分で一から書くより楽な場合があります。
ただし、自動生成なので改行とかインデントつけたりして、見やすくする必要がありますし、
前述したとおり、想定外のコードが生成される場合があるので、ちゃんと中身を確認・理解したうえで適宜カスタマイズする必要があります。
0 件のコメント:
コメントを投稿