SAS

GTLの軸設定を極める(1) 軸タイプを使い分ける

グラフを希望通りに作成するためには軸の設定方法を理解することはとても大事です。設定項目は多いので実務でとくにおぼえておいたほうがいい部分だけを複数回紹介します。

GTLでは4つの軸タイプがあり、作図によって使い分ける必要があります。

軸タイプの種類と設定方法

GTLで用意されている軸は以下の通りです

タイプ名説明
linear連続変数を指定した時に設定される。目盛りの値は大小関係があり、目盛の間にも数値が存在している。
discrete離散変数(文字列変数)を指定した時に設定される。目盛の間には値は存在しない。
log対数軸。値が大きくばらついているときに使用すると見やすくなる。0以下は定義されない。
time時間軸。時系列データを作図するときに用いる。

linearのほうが使い勝手が良い

discreteを使用する場合は注意点があります。それはdiscreteをサポートしていないplotステートメントがいくつか存在することです。

例えばvectorplotステートメントはdiscreteでは作図できずエラーとなります。またbarchartやboxplotなどは特に指定しない場合は自動的に軸がdiscreteに設定されるため、もし別のグラフを重ね合わせる場合は
軸設定を明示的に指定する必要があります。

そのためdiscreteよりもlinearを利用したほうが利便性が高いです。例えばA群、B群・・・といったカテゴリ変数を軸変数と指定する場合、文字列ではなくフォーマットを当てたコード値(連番)を指定したほうが重ね合わせられるグラフがずっと増えます。軸目盛はフォーマットが反映されますので、見た目はdiscreteを使用した場合と全く同じです。

例えばバイオリンプロットの作図例では、カテゴリ変数をコード値変数として置き換えて作図しています。文字列変数を軸として指定すると作図不可となります。

GTLでバイオリンプロットを作図する(2) 単純なバイオリンプロット前回に引き続き、バイオリンプロットの作図方法を解説します。 前回はカーネル密度推定を実行し、作図データセットを作成しました。 今回は...

ウォーターフォールプロットと矢印を重ね合わせる場合は、軸タイプを明示的にlinearに指定しないとエラーになります。これは棒グラフを指定すると自動的に軸タイプがdiscreteに設定されるためです。

https://picolabs.jp/SAS-GTL-waterfallplot

軸タイプを気を付けないとデータが表示されないといった問題も発生します。過去記事でも紹介しています。

vlineステートメントを使うと目盛に存在するデータしか表示できない問題について他部署の人から折れ線グラフをsgplotで作図するとき、目盛に存在しないデータはデータセットに含まれていても勝手に除外するという話を聞き...

指定方法

軸を明示的に指定する場合はxaxisoptsまたはyaxisoptsオプションでtypeを指定するだけです。軸の詳細設定を軸タイプごとにオプションが用意されているので、指定した軸のオプションを使用しましょう。

/*線形軸*/ 
layout overlay / xaxisopts=(type=linear linearopts=(設定)); ・・・ 
endlayout; 

/*離散軸*/ 
layout overlay / xaxisopts=(type=discrete discreteopts=(設定)); ・・・ 
endlayout; 

/*対数軸*/ 
layout overlay / xaxisopts=(type=log logopts=(設定)); ・・・ 
endlayout; 

/*時間軸*/ layout overlay / xaxisopts=(type=time timeopts=(設定)); ・・・
endlayout;

おそらく一番使用するにはdiscreteとlinearでしょう。以下の例ではこの二つの軸の違いを示したものです。
discreteは目盛の大小関係はないため棒グラフは等間隔に並びますが、linearは各目盛りの大小が反映されています。

proc template; 
define statgraph axis; 
begingraph; 
entrytitle "type=linear"; 
/*離散軸 discreteの設定*/ 
/* layout overlay / xaxisopts=(type=discrete); */ 
/*線形軸 linearの設定*/ 

layout overlay / 
   xaxisopts=(type=linear offsetmin=0 offsetmax=0 
     linearopts=(tickvaluelist=(1 2 4 8 24 ) viewmin=0 viewmax=30)
   ); 

   barchartparm category=time response=response / 
      errorupper=upper 
      errorlower=lower 
      display=(outline) 
      errorbarattrs=(color=black); 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=test template=axis; 
run;
discrete
linear