2017年2月14日火曜日

annotateマクロの%systemの話

gplotなりsgplotなりグラフを作る時に、annotateマクロを使用することはあると思います。
数あるannotateマクロの中に、%system(hoge,hoge,hoge);があります。今回はそのお話
前にあげた<http://dengonmemo.blogspot.jp/2016/09/sas_29.html>と関連しています。
私も正しく理解しているかは怪しいところなので、間違っているかもしれませんです。

このマクロはannotateで文字やら線やらをグラフ内に書くときに、書く場所の設定をするマクロです。
そもそもsasで出したグラフには、data Area、Graphics Area、output Areaの3つがあります。
その三つを図で書くとだいたい下記のイメージです。(それぞれの斜線部分がそのAreaに対応)

data area(実際にグラフの値があるエリア)
|-----------------------|
|   |-----------------|   |
|   |                       |   |
|   |  ↑ /////////////    |   |
|   | |/////////////    |   |
|   | |/////////////    |   |
|   | |---→  |   |
|   |----------------  |   |
|                               |
|---------------------- |

Graphics Area(画面全体)
|---------------------|
|/////////////////////////|
|/|-----------------|///|
|/|/////////////////////|///|
|/|/ ↑/////////////////|///|
|/|/|////////////////|///|
|/|/|////////////////|///|
|/|/|---→//|///|
|/|/////////////////////|///|
|/|------------------|///|
|//////////////////////////|
|----------------------|

Output Area(全体からheaderとfooterを除いたところ)
|-----------------------|
|                               |
| |-------------------|   |
| |///////////////////////|   |
| |/↑////////////////////|   |
| |/|//////////////////|   |
| |/|//////////////////|   |
| |/|---→////|   |
| |///////////////////////|   |
| |-------------------|   |
|                               |
|----------------------- |

%systemの引数に1,2を指定するとData Area、3,4でGraphics Area、5,6でoutput Areaに
以降で使用するannotateマクロが出力されるようになります。
また1,3,5を指定すると百分率、2,4,6を指定すると座標で、以降のannotateマクロでの座標が指定できるようになります。

例えば%system(2,2,3)で、グラフのdata Areaの座標でannotateマクロを指定できます。
この下に%line( 1 , 30 , 1 , 28.5   , black, 1  , 0.15   );とすると
[1,30]から[1,28.5]に線を引きます。
%system(1,2,3)と記載した際、第一引数が1なので出力が百分率扱いなので、
この下のannotateマクロの指定で100より大きい値は指定できません。(100%が最大値)

また以下の様に一つのデータステップで複数回%systemは指定できます。
指定のたびに設定が切り替わります。
data anno;
    %system(2,2,3);
    *-----lineのX,Yは座標で指定できる;
    %line(~~);

  *-----lineのXは百分率(%)、Yは座標で指定できる;
    %system(1,2,2);

    %line(~~);
run;

%systemの第三引数は私も良くわかっていないので、今は扱っていません。
どなたか教えていただければ…

2017年2月3日金曜日

グラフの中の軸の範囲外の値を、はみ出ていることが分かるように出力する話

通常sasのgplotで出力したグラフは、軸に設定した値に収まらないデータがいる場合、
ログに範囲外のデータがいますよってnoteを出してくれます。
出してくれますが、出力したグラフを見てもどこが範囲外のデータなのかはわかりません。
今回ははみ出たデータをグラフにそれとわかるように出力するお話です。

data hoge;
    a = 1; Y = 2; output;
    a = 2; Y = 3; output;
    a = 3; Y = 4; output;
    a = 4; Y = 5; output;
    a = 5; Y = 3; output;
    a = 6; Y = 7; output;
    a = 7; Y = 4; output;
    a = 8; Y = 8; output;
    a = 9; Y = 4; output;
run;


*---------- 何の設定もしない場合;
proc gplot data = hoge;
    plot Y * A / vaxis = axis1 haxis = axis2 ;
    symbol1 c = black V = dot I = join;
    *---------- y軸目盛;
    axis1
      order = (1 to 5 by 1)
      origin=(10, 30)
      ;
    *---------- x軸目盛;
    axis2
      order=( 1 to 10 by 1 )
      origin=(10, 30)
    ;
run;

範囲外のデータがいますよのログ




グラフ


追加する設定は、symbolステートメントに追加された mode = include のことです。
*---------- 軸の幅を値が超えていたらはみ出るように設定;
proc gplot data = hoge;
    plot Y * A / vaxis = axis1 haxis = axis2 ;
    symbol1 mode = include c = black V = dot I = join;
    *---------- y軸目盛;
    axis1
      order = (1 to 5 by 1)
      origin=(10, 30)
      ;
    *---------- x軸目盛;
    axis2
      minor = none major = (w = 1.5)
      order=( 1 to 10 by 1 )
      origin=(10, 30)
    ;
run;



これではみ出たことがわかります。
はみ出るだけでなく、範囲外のデータを計算に含めることもできます。