SAS

sgplot vs GTL 使いやすいのはどっち?

SAS/GRAPHには複数の作図プロシジャが存在します。その中で最も使用頻度が高いsgplotプロシジャとGTLは、両者とも大体同じことができます。
では業務上どちらを使ったほうが良いのでしょうか?

結論

最初に結論を述べます。

個人で作業する分にはどちらを使っても問題はないと思いますが、論文投稿またはプレゼン資料として作図する場合と複数の担当者が作図プログラムを共有する場合はGTLをお勧めします。

理由

sgplotでは作図できないグラフがある

sgplotとGTLでサポートしているグラフステートメントはどちらも同じ機能を持っているため、プロットエリアが一つしかない場合はどちらを使っても同じ結果が得られます。むしろsgplotの方がコード量が少なく済みます。

しかしsgplotでは以下のような作図が不可能なグラフがいくつか存在します。

  • 軸が存在しないグラフ(円グラフ、モザイクプロット)
  • 複数のプロットを設置する場合(一部はsgpanelでも可能だか、詳細なカスタマイズは難しい)

通常の業務ではsgplotだけで事足りることが多いと思いますが、少々複雑な仕様で作図する場合はあわててGTLに切り替えざるを得ません。

GTLはレイアウトブロックというHTMLに似た言語体系を持ちsgplotとは文法が異なるため、sgplotしか使ったことがない方は苦戦するかもしれません。そういう可能性があるのであれば最初からGTLで統一して作図を実施する仕組みを用意しておいたほうが安全だと思います。

sgplotでできることはGTLでも可能です。

テンプレートを再利用する仕組みがある

sgplotには既存の作図プログラムを再利用する仕組みはありません。

例えばグラフに使用する変数やタイトル、軸タイトルを変更する場合はプログラム自体を書き換えるしか方法がありません。マクロ化して、作図ごとに変わる部分を引数として定義すれば再利用できますが、マクロの仕組みは自由すぎるため担当者毎に同じ作図であっても異なるプログラムが出来上がってしまう可能性が高いです。

一人で作業する分には問題ないですが、他の担当者にバトンタッチするときはしっかりドキュメントを用意しないと、後任の担当者がコードの意味を理解するのに苦労することになるかもしれません。

GTLには最初からテンプレートを再利用する仕組みが備わっています。マクロの引数に相当するdynamic variableを利用すればsgrenderプロシジャで使用したい変数をその都度指定するだけで変数を切り替えて作図することができます。

プロシジャ自体にこの仕組みが備わっているため、誰がプログラムを書いてもおおよそ同じ仕様になりやすいです。一つのグラフテンプレートをチームメンバーで共有することも容易でしょう。

グラフの定義内容を極力テンプレートに集約できる

sgplotではプロシジャ内でattribute mapを直接定義することはできません。

attribute mapとはデータとグラフオブジェクトの属性(線の色やマーカーシンボルなど)を紐づける仕組みのことで、必ず使用するものといってよいものです。

sgplotではattribute mapの定義をデータセット(attribute map data set) として作成し、sgplotプロシジャで読み込むという仕組みを取っています。

そのためグラフの作図の定義がsgplotプロシジャ内と、attibute map data setの2つで定義されることになり、グラフの定義部分がバラバラになりやすいです。

attribute mapの定義をデータセットして作成することには大してメリットはありません。定義内容をデータステップのステートメントで機械的に生成することは普通できませんし、結局データステップに直打ちするしかないため、作業効率が上がるというわけではありません。

むしろグラフの定義する箇所が2つに分かれてしまい、コードの保守が面倒になるデメリットの方が大きい気がします。またデータセットによる定義だと変数名や変数長を定義する手間も発生します。

GTLはテンプレート内で直接attribute mapを定義することもできますし、attribute map data setを読み込みこともできます。attribute mapの定義方法に関してはGTLの方が柔軟に対応できます。

まとめ

GTLは既存のグラフ出力プロシジャ(sgplot ,sgpanel, sgscatterなど)を統合して機能を拡張した感じなので実質sgplotの上位互換です。またいくつかのグラフはsgplotでは出力できません。異なるグラフを複数表示する場合もGTLのほうができることが多いです。

またGTLはグラフテンプレートを使いまわすことを想定しているため、dynamic variableをいう使用する変数を動的に変更する機能が最初から組み込まれています。

sgplotはそのような機能はないため、作図したい変数を変更する場合はsgplotのコードを書き換える必要があります。もしGTLと同様なことをする場合はマクロ化する必要があります。

GTLはSAS baseと文法が異なり覚えるのはめんどくさいですから、既存のsgplotやgplotで書かれたコードをコピペして使っている担当者も多いかと思いますが、汎用性やソースコードの保守性を考えると今後はsgplotよりもGTLを利用したほうが良いと思います。