SASでGIFアニメを作る





















先日のユーザー総会で発表されていた「動画による統計表現~新しい統計の要約~」という論文にとても感動した。

面白い、凄い!絶対に読むべき論文です。

ただ、SG系で作成された画像ファイルからGIFアニメーションファイルを作成する際の方法の理屈が、発表を聞いている時は、理解できなかった。
質問までさせていただいたのに、よくわからなかった。

それもこれも、9.2でSG系グラフがでて、GTL使えるようになったから、G系グラフのANNOTATEのこと勉強しなくてもいいや~、全部テンプレートでなんとかできるでしょ、とか甘い考えして、ANNOTATEの勉強しなかったせいだ。

gannoプロシジャの意味がわからなかった。


ただ、その後、実際論文集のコードを全て打って、やってみて、やっとわかった。

gannoプロシジャはANNOTATEデータセットを読み込んで、その指定に基づいて出力を作成するもので、その中でファイルを指定して画像イメージを表示するコマンドを使って、G系出力ではない画像ファイルを無理やりG系出力にしちゃうことで、G系出力からGIFアニメを作成するGIFANUMオプションの網にかけちゃおうって発想なわけね!
凄い!どうやったら、そんな発想が!!

試しに自分も何か作ってみたくなったけど、何も思いつかない。
ので、以前の記事
「ods graphicsで作成される複合グラフを1つ1つのプロットに分解する話」
http://sas-tumesas.blogspot.jp/2014/03/ods-graphics.html

で、分解されたプロットをアニメとして再合成してみる。
わかりやすくするためにベタベタ打ちで。

data Q1;
X=1;Y=4;output;
X=2;Y=5;output;
X=5;Y=8;output;
X=6;Y=9;output;
X=9;Y=12;output;
X=11;Y=10;output;
X=22;Y=26;output;
X=12;Y=15;output;
run;

ods graphics on/reset imagename='P' width=600px height=400px;
proc reg data=Q1 plots(only)=DiagnosticsPanel(unpack);
model Y = X;
run;
quit;
ods graphics off;

data ANNO;
 length imgpath function style $32.;
 retain xysy ysys '3' hsys '3' when 'a';
 function='image';X=100;Y=100;imgpath='P.png';output;
 function='image';X=100;Y=100;imgpath='P1.png';output;
 function='image';X=100;Y=100;imgpath='P2.png';output;
 function='image';X=100;Y=100;imgpath='P3.png';output;
 function='image';X=100;Y=100;imgpath='P4.png';output;
 function='image';X=100;Y=100;imgpath='P5.png';output;
 function='image';X=100;Y=100;imgpath='P6.png';output;
 function='image';X=100;Y=100;imgpath='P7.png';output;
run;


filename animmap "C:\SAMP.gif";
goptions reset=goptions device=gifanim gsfmode=replace gsfname=animmap
xpixels=601 ypixels=401 cback=white iteration=0 delay=100 disposal=background border htitle=13pt;

proc ganno anno=ANNO;
where monotonic()=1;
run;
goptions gsfmode=append;
proc ganno anno=ANNO;
where monotonic()=2;
run;
proc ganno anno=ANNO;
where monotonic()=3;
run;
proc ganno anno=ANNO;
where monotonic()=4;
run;
proc ganno anno=ANNO;
where monotonic()=5;
run;
proc ganno anno=ANNO;
where monotonic()=6;
run;
proc ganno anno=ANNO;
where monotonic()=7;
run;
goptions gepilog='3B'x;
proc ganno anno=ANNO;
where monotonic()=8;

run;


結果は冒頭に貼った図です。


0 件のコメント:

コメントを投稿