ラベル ODS GRAPHICS の投稿を表示しています。 すべての投稿を表示
ラベル ODS GRAPHICS の投稿を表示しています。 すべての投稿を表示

2019年12月6日金曜日

[SGプロシジャ] スタイル属性の組み合わせ方法を設定する





SAS9.4で追加になった「ODS GRAPHICS の ATTRPRIORITY=オプション」をご紹介します。


この「ATTRPRIORITY=オプション」は、SGプロシジャでの「スタイル属性の組み合わせ方法」を設定することができます。
ていわれても意味不明かもしれないんで、とりあえず例を見てみましょうか。





「ATTRPRIORITY=オプション」の例


ATTRPRIORITY=COLOR

ods graphics / attrpriority=color;

proc sgplot data=sashelp.class;
    styleattrs datacontrastcolors=(blue orangedatasymbols=(circlefilled starfilled) ;
    scatter x=height y=weight / group=sex markerattrs=(size=12pt);
run;




  • 変数SEXをグループ変数として、シンボルを分けています。
  • 今回は説明しやすくするため、STYLEATTRSステートメントを使って、以下のスタイル属性を明示的に設定しています。
    • シンボルカラーを「BLUE」と「ORANGE」
    • シンボルを「円」と「星」


このスタイル属性に対して「ATTRPRIORITY=COLOR」は以下のイメージでグループごとの「スタイル属性の組み合わせ」を作ります。













1つ目のグループ「BLUE」と「円」の組み合わせ
2つ目のグループ「ORANGE」と「円」の組み合わせ
3つ目のグループ「BLUE」と「星」の組み合わせ
4つ目のグループ「ORANGE」と「星」の組み合わせ

というようにカラーを循環させて組み合わせていきます。





ATTRPRIORITY=NONE

ods graphics / attrpriority=none;

proc sgplot data=sashelp.class;
    styleattrs datacontrastcolors=(blue orangedatasymbols=(circlefilled starfilled) ;
    scatter x=height y=weight / group=sex markerattrs=(size=12pt);
run;



「ATTRPRIORITY=NONE」は以下のようなイメージです。



1つ目のグループ「BLUE」と「円」の組み合わせ
2つ目のグループ「ORANGE」と「星」の組み合わせ

というようにすべてのスタイル属性をグループごとに循環させていきます。





長所と短所



  • 「ATTRPRIORITY=NONE」とした方が見やすいグラフになりやすい

さきほどの「ATTRPRIORITY=COLOR」の例では、グループごとに「色違いの同じシンボル(円)」がPLOTされているのに対して、「ATTRPRIORITY=NONE」の例では、グループごとに「色もシンボルも異なる」PLOTができるので、当然見やすくなるわけです。



  • 「ATTRPRIORITY=COLOR」の方が、組み合わせを多く作れる

記事の最初に示した例では、2つの「シンボル」と2つの「色」をスタイル属性として定義しました。
これに対して「ATTRPRIORITY=COLOR」では4つの組み合わせが作れるのに対して、「ATTRPRIORITY=NONE」では2つしか作れません。


なにが言いたいかというと、たとえば以下の例をご覧ください。

ods graphics / attrpriority=none;

proc sgplot data=sashelp.class;
    styleattrs datasymbols=(circlefilled starfilled) datacontrastcolors=(blue orange);
    scatter x=height y=weight / group=age markerattrs=(size=12pt);
run;



変数AGEをグループ変数として、シンボルを分けていますが、異なるグループにも関わらず、同じシンボルとカラーが割り当てられてしまいました。


これは、スタイル属性が循環して使われるためです。
(たとえばカラー属性だと「BLUE」→「ORANGE」→「BLUE」→「ORANGE」という感じで、設定されている色を使い切ると循環して同じ色が使われる)

この循環は「ATTRPRIORITY=COLOR / NONE」どちらも起こり得ますが、使える組み合わせが少ないと、こういった不具合を起こしていしまいやすいですね。


2019年3月19日火曜日

【小技】ODSグラフの保存時、ファイル名にBY値を入れる




まず、前提知識として以下「ODSグラフを画像ファイルとして保存する方法」を一読ください。
https://sas-boubi.blogspot.com/2015/09/odssg.html



そして今回紹介するのが、SAS9.4M5からの新機能。
以下のプログラムをご覧ください。

proc sort data=sashelp.class out=class;
   by age;
run;

options nobyline;
ods graphics  /  reset=index imagename='test_#byval1'  outputfmt=png;
ods html close;   /* ←他に開いているODS出力先があれば全てCLOSEして下さい */
ods listing gpath="出力するパスを指定";

   proc sgplot data=class;
      scatter x=height y=weight;
      by age;
   run;

ods listing close;
ods graphics  /  reset=all;
ods html; /* ←デフォルトの出力をHTMLにしている場合に記述  */
/* その他、デフォルトの出力があれば、適宜記述 */


「ODS GRAPHICS」の「IMAGENAME=」の中で#BYが使えるようになりました!
上の例では「test_11.png、test_12.png・・・」という感じでファイルが作られます。


「OPTIONS NOBYLINE」と#BYの具体的な挙動は以下のリンク記事を参照下さい。



ただし!!

現状、#BYLINEと#BYVAR は挙動が安定していなかったので使用しない方が良さそう。
具体的には

  • #BYLINEを指定するとログにWARNINGがでて環境によってはファイル名もおかしくなる(そもそもリファレンスにも#BYLINEの使用について言及されていない)
  • #BYVARを指定すると、BY変数にラベルがついてても、ラベルではなく変数名が返される(リファレンスに書かれている挙動と異なる)

将来のバージョンで修正されるかもしれないですが、現状は#BYVALのみ使うほうがよさそうです。



2019年1月11日金曜日

ODS GRAPHICSの設定を保存・復元する。




SAS9.4M3からODS GRAPHICSの設定を一時保存・復元する「PUSH・POPオプション」が追加されました。

本題に入る前に、まずは前提知識として「SHOWオプション」から紹介していきます。




SHOWオプション

ODS GRAPHICS / SHOW ;

  • 現在のODS GRAPHICS の設定をログに表示することが出来ます。
  • SAS9.4M3以降の機能です。


ods graphics / show ;



PUSHオプション

ODS GRAPHICS / PUSH ;

  • 現在のODS GRAPHICSの設定を一時保存することが出来ます。
  • SAS9.4M3以降の機能です。
  • PUSHオプションを指定する度に、その時点のODS GRAPHICSの設定を別々に保存することが出来ます。



/*** ① 現在のODS GRAPHICSの設定を見てみる ********/
ods graphics / show;

/* 設定を保存 */
ods graphics / push;



/*** ② ODSで出力される画像の幅を300pxに変更 ********/
ods graphics / width=300;
ods graphics / show;

/* 設定を保存 */
ods graphics / push;





POPオプション

ODS GRAPHICS / POP ;

  • 一時保存したODS GRAPHICSの設定を呼び出すことが出来ます。
  • SAS9.4M3以降の機能です。
  • POPオプションを指定する度に、PUSHで保存した設定の新しい方から順に呼び出されます。
  • つまり、PUSHで設定①、設定②、設定③と3回設定を保存した場合、POPでは設定③、設定②、設定①という順で呼び出される(スタックの原理)



/* 設定の呼び出し */
ods graphics / pop;
proc sgplot data=sashelp.class;
  scatter x=height y=weight;
run;

/* 設定の呼び出し */
ods graphics / pop;
proc sgplot data=sashelp.class;
  scatter x=height y=weight;
run;





役に立つ例

汎用マクロを作る際に便利です。以下の例をご覧ください。

%macro test;

  /* 現在のODS GRAPHICSの設定を保存しておく */
  ods graphics / push;

  /* SGPLOT */
  ods graphics / reset=all height=500 width=500;
  proc sgplot data=sashelp.class;
       scatter x=weight y=height;
  run;

  /* マクロ実行前のODS GRAPHICSの設定に戻す */
  ods graphics / pop;

%mend;

  • マクロの最初にPUSH、最後にPOPを置いています。
  • これにより、いくらマクロの中でODS GRAPHICSの設定をいじっていても、マクロ実行後には設定を元に戻すことが出来ます。


2018年5月18日金曜日

ODSグラフを画像ファイルとして保存する際、ファイル名の末尾の開始番号を指定する




ODSグラフを画像ファイルとして保存する方法自体は、以下記事をご覧下さい。
(特に画像ファイル名がおかしくなる場合がある件を知らない方は要チェック!)

http://sas-boubi.blogspot.jp/2015/09/odssg.html



そして今回は、SAS9.4のメンテナンスリリース3から追加になった機能の紹介です。
まず以下のプログラムをご覧ください。

ods graphics  /  reset=index  imagename="SAMPLE"  outputfmt=png ;
ods html close;
ods listing gpath="C:\TEST";

      proc sort data=SASHELP.CLASS OUT=CLASS;
         by AGE;
      run;

      proc sgplot data=CLASS;
         scatter x=HEIGHT y=WEIGHT;
         by AGE;
      run;

ods listing close;
ods graphics  /  reset=all;
ods html;


by変数AGEの値毎に以下6個のグラフが作られます。ここまでは今までの機能です。

SAMPE.png
SAMPE1.png
SAMPE2.png
SAMPE3.png
SAMPE4.png
SAMPE5.png



では次に上のプログラムの青字箇所を以下のように変えて再実行してみます。

reset=index(100)  

すると、ファイル名の末尾の番号が100から始まるようになりました。

SAMPE100.png
SAMPE101.png
SAMPE102.png
SAMPE103.png
SAMPE104.png
SAMPE105.png



SAS9.4のメンテナンスリリース3から、ファイル名末尾の開始番号を指定出来るようになりました。

ODS GRAPHICS / RESET = INDEX( ファイル名末尾の開始値 ); 



なので、開始値を1からにしたい場合、

reset=index(1)  

とすれば、SAMPLE1.png ~ SAMPLE6.png と作ることが出来ます。




2015年9月11日金曜日

ODSグラフ(SG系グラフ)を、画像ファイルとして保存する方法



🔎 重要
  • 一部のODS出力(ODS HTML, ODS EXCEL等)が開いていると、保存する画像ファイル名がおかしくなることがあるので、それらは最初にCLOSEしておくこと(理由は最後のリンク記事を参照)
  • 以下「outputfmt」はSAS9.2では「imagefmt」に変更する必要あり




ods html close;   /* ←他に開いているODS出力先があればCLOSEして下さい */

ods graphics  /  reset=index  imagename="SAMPLE"  outputfmt=png;
ods listing gpath="C:\TEST";

     proc sgplot data=SASHELP.CLASS;
        scatter x=HEIGHT y=WEIGHT;
     run;

ods listing close;
ods graphics  /  reset=all;

ods html;      /* ←デフォルトの出力をHTMLにしている場合に記述  */
ods listing;    /* ←デフォルトの出力をLISTINGにしている場合に記述  */
/* その他、デフォルトの出力があれば、適宜記述 */


SAMPLE.png





構文と解説


ODS GRAPHICSのオプション

reset = リセットする設定
imagename = "ファイル名"
outputfmt = ファイル種類 (jpg, png等) ※SAS9.2ではオプション名をimagefmtに要変更


ODS LISTINGのオプション

gpath = "ファイルパス";


プログラム中の最初のほうの「reset=index」と最後のほうの「ods graphics  /  reset=all;」を消して何回か実行してみてください。

最初に実行すると 「SAMPLE.png」 が作成されますが、繰り返し実行する度に 「SAMPLE1.png」「SAMPLE2.png」 というように連番が振られた別ファイルが作られてしまいます。

この連番をリセットするのが「reset=index」です。
また最後に「reset=all」で、ODS GRAPHICSの設定を全てリセットしています。




注意事項

ODSグラフ(SG系グラフ)保存時の落とし穴