ラベル プロシジャ: TEMPLATE の投稿を表示しています。 すべての投稿を表示
ラベル プロシジャ: TEMPLATE の投稿を表示しています。 すべての投稿を表示

2019年6月25日火曜日

スタイルテンプレート名を一覧表示する



以下プログラムで、結果ビューアに一覧表示されます。

proc template;
    list styles;
run;


2019年6月20日木曜日

スタイルテンプレートのソースを表示する




以下の構文でスタイルテンプレートのソースを表示することができます。



構文
proc template;
    source スタイル名;
run;



例
proc template;
   source styles.printer;
run;

Log



元からあるスタイルを継承して新たなスタイルを作成する場合とかに、継承元のスタイルの設定がどうなってるか確認する必要があるんで、この機能が必要になります。



2016年12月15日木曜日

GTLで線形軸(LINEAROPTS=オプション)の最小・最大値を設定する際の注意点




よく勘違いする部分なので、まとめておきます。
ここでは「LAYOUT OVERLAY」内で線形軸を設定する場合の説明になります。



まずは軸設定の失敗例を2つ。

失敗例1
「TICKVALUESEQUENCE」や「TICKVALUELIST」で目盛を設定できますが、
たとえば以下の通り目盛「0~30」、目盛間隔「1」 と設定すると、、

proc template ;
   define statgraph MYGRAPH;
      begingraph;
      layout overlay / xaxisopts=(linearopts=(tickvaluesequence=(start=0 end=30 increment=1)));
           scatterplot x=AGE y=WEIGHT;
      endlayout;
      endgraph;
   end;
run;

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;



実際のデータ(Age)が「11~16」の範囲にあるため、目盛は0~30ではなく、11~16になっています。


失敗例2
では今度は、目盛 「12~14」、目盛間隔「1」 と設定した場合、

proc template ;
   define statgraph MYGRAPH;
      begingraph;
      layout overlay / xaxisopts=(linearopts=(tickvaluesequence=(start=12 end=14 increment=1)));
           scatterplot x=AGE y=WEIGHT;
      endlayout;
      endgraph;
   end;
run;

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;



実際のデータ(Age)は「11~16」なので、軸は11~16の範囲まで設けられますが、目盛としては12~14が表示されます。



よく頂く質問が、『軸の最小・最大値を 「TICKVALUESEQUENCE」や「TICKVALUELIST」で設定したのに、うまく設定できない!』というものです。
上記で説明した通り、 「TICKVALUESEQUENCE」や「TICKVALUELIST」は目盛を設定するだけなので、軸の範囲(最小・最大)も別途設定する必要があります。



以下に軸の設定例を2つ紹介します。
【シチュエーション】軸の最小・最大を0~30、目盛間隔を2に設定したい


軸の設定例1
「TICKVALUEPRIORITY=TRUE」を指定することで、「TICKVALUESEQUENCE」や「TICKVALUELIST」による目盛の最小・最大値を軸に含めることが出来ます。

proc template ;
   define statgraph MYGRAPH;
      begingraph;
      layout overlay / xaxisopts=(linearopts=(tickvaluepriority=true
                                                               tickvaluesequence=(start=0 end=30 increment=2)));
           scatterplot x=AGE y=WEIGHT;
      endlayout;
      endgraph;
   end;
run;

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;

ただし「失敗例2」のように、
「TICKVALUESEQUENCE」や「TICKVALUELIST」で設定した目盛の範囲外に、実際のPLOTするデータがある場合、「TICKVALUEPRIORITY=TRUE」は効果なしです(結果は「失敗例2」の出力結果と同様、実際のPLOTするデータの範囲まで軸が拡張される)



軸の設定例2
「VIEWMIN」,「VIEWMAX」で軸の範囲(最小・最大)を設定し、「TICKVALUESEQUENCE」や「TICKVALUELIST」で目盛を設定する。

proc template ;
   define statgraph MYGRAPH;
      begingraph;
      layout overlay / xaxisopts=(linearopts=(viewmin=0 viewmax=30
                                                               tickvaluesequence=(start=0 end=30 increment=2)));
           scatterplot x=AGE y=WEIGHT;
      endlayout;
      endgraph;
   end;
run;

proc sgrender data=SASHELP.CLASS template=MYGRAPH;
run;

注意点として、
「VIEWMIN」「VIEWMAX」で軸の範囲(最小・最大)が固定されるので、実際のPLOTするデータが軸の範囲外にあっても、その範囲外のPLOT部分はグラフに表示されません。


最後に、
他のオプションとの組み合わせによって、今回紹介したオプションの機能が無効または挙動が変わるので、その辺りの細かい部分についてはリファレンスも確認してみて下さい。



2016年7月1日金曜日

SGPLOTでTEMPLATEプロシジャのコードを自動生成する【TMPLOUT=オプション】





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=オプションでコードを自動生成してしまえば、自分で一から書くより楽な場合があります。

ただし、自動生成なので改行とかインデントつけたりして、見やすくする必要がありますし、
前述したとおり、想定外のコードが生成される場合があるので、ちゃんと中身を確認・理解したうえで適宜カスタマイズする必要があります。


2016年3月3日木曜日

箱ひげ図をかく 【GTL編】




GTLの詳細については、以下リンクをご覧ください。



BOXPLOTステートメントの構文


  BOXPLOT X=カテゴリ Y=分析変数 / オプション;


  • デフォルトでカテゴリ(X軸)は離散軸になりますが、ユーザー側で線形軸等に変えると、挙動が変わってしまいます。詳細はリファレンスを要確認。



オプション

  設定内容  指定   詳細設定
  箱ひげ図を横に寝かす 

  ORIENT =  HORIZONTAL  

    
  箱の幅

  BOXWIDTH  =  0~1

  
  箱の書式

  FILLATTRS  =  (詳細設定) 

  COLOR = 色

  ひげの書式

  WHISKERATTRS  =  (詳細設定) 

  COLOR = 色

  中央値の書式

  MEDIANATTRS  =  (詳細設定)

  COLOR = 色

  平均値の書式 

  MEANATTRS  =  (詳細設定)
  
  COLOR   = 色
  SYMBOL = 表示マーク  

  外れ値の書式 

  OUTLIERATTRS  =  (詳細設定)   

  SYMBOL = 表示マーク 
  

…etc ( 色々できるのでリファレンスを確認してみてください )



注意
  • オプションの組み合わせで挙動が変わる可能性あり。
  • デフォルトで出力される箱ひげ図のタイプ(箱、ひげ、外れ値等の定義)はリファレンスを要確認



1. 簡単な例

proc template ;
  define statgraph MYGRAPH;
      begingraph ;
         entrytitle "お魚の体重分布";
         layout overlay  ;
              boxplot x=SPECIES y=WEIGHT;
         endlayout;
       endgraph;
  end;
run;

proc sgrender data=SASHELP.FISH template=MYGRAPH;
run;



2.カスタマイズ

proc template ;
  define statgraph MYGRAPH;
      begingraph ;
         entrytitle "お魚の体重分布";
         layout overlay  ;
              boxplot x=SPECIES y=WEIGHT /
                            orient = horizontal
                            meanattrs = (color=black symbol=plus)
                            medianattrs = (color=black)
                            whiskerattrs = (color=black)
                            fillattrs = (color=white)
                            outlierattrs = (symbol=circlefilled)
                            boxwidth = 0.5
              ;
         endlayout;
       endgraph;
  end;
run;

proc sgrender data=SASHELP.FISH template=MYGRAPH;
run;




2015年7月10日金曜日

Graph Template Language(GTL)入門:基本構文


簡単なグラフであれば、SGPLOTプロシジャなどが使えますが、
デザインをこうしたい、ああしたい、、という場合、カスタマイズしたグラフのテンプレートを作る必要があります。

このテンプレートを作るのが、Graph Template Language(GTL)です。

出来ることが多すぎるので、ざっくり解説したいと思います。
間違ってるところなどがあれば、修正・追記していく予定ですので、ご指摘お願いします。


基本構文

①まずは、TEMPLATEプロシジャでグラフテンプレートを作ります。

PROC TEMPLATE  ;
   DEFINE STATGRAPH テンプレート名  ;
       BEGINGRAPH  ;

               ENTRYTITLE "グラフタイトル" ;
               LAYOUT レイアウト種類  ;
                      プロット文  ;
               ENDLAYOUT ;
               ENTRYFOOTNOTE "フットノート" ;

       ENDGRAPH  ;
   END  ;
RUN ;

  DEFINE STATGRAPH テンプレート名 ;
      ~
  END ;
 作成するテンプレート名を指定。
 適当な名前でok。

  BEGINGRAPH ;
      ~
  ENDGRAPH ;
 お決まりの文。開始と終了を明示。


  ENTRYTITLE "タイトル" ;

 グラフのタイトル

  ENTRYFOOTNOTE "フットノート" ;

 グラフのフットノート

  LAYOUT レイアウト種類 ;
      ~
  ENDLAYOUT ;

 複数のプロットを左右に並べたり、重ねたり、、
 等のレイアウトの種類を選択します。

 (ここは別の機会で紹介予定)


②上で作ったテンプレートを、SGRENDERプロシジャで読み込んで、グラフを作ります。

PROC SGRENDER  DATA=プロットするデータセット  TEMPLATE=テンプレート名 ;
RUN;



簡単な例

* Sample Dataset ;
data DT1;
    input DAY WEIGHT;
    cards;
0  85.5
10 79.5
20 75.2
30 70.5
40 65.8
50 72.1
;

* テンプレートを作成 ;
proc template ;
  define statgraph MYTEMP ;
     begingraph;

          entrytitle "ダイエット記録";
          layout overlay;
               seriesplot x=DAY y=WEIGHT / display=all ;
          endlayout;   

     endgraph;
  end;
run;

* テンプレートを使って、グラフを作成 ;
proc sgrender data=DT1 template=MYTEMP ;
run;




(上記「結果のグラフ出てこないよ」って場合は、なんかしらの設定によって出力がオフになっている可能性あり)


解説

基本構文と照らし合わせると理解しやすいと思います。
ただしプログラム中の以下の部分は、別記事で解説予定なので、詳細は割愛します。

layout overlay;
     seriesplot x=DAY y=WEIGHT / display=all ;
endlayout;  

ざっくりですが、
layout overlayでなんかレイアウトを設定してから、seriesplotステートメントを使って時系列にプロットをしてるって感じです。



GTL入門記事一覧