ラベル プロシジャ:TEMPLATE の投稿を表示しています。 すべての投稿を表示
ラベル プロシジャ:TEMPLATE の投稿を表示しています。 すべての投稿を表示

smoothconnectでSG系グラフの線を滑らかにする話

最近、エクセルで滑らかな曲線の折れ線グラフを書いてる人がいて、「へ~、そんなんできるんだ」と言うと、「は?そんなんも知らないんですか?」と馬鹿にされました。

だって、最近のエクセルあんまりよく知らないしと言うと、「スムージングにチェック入れるだけだし、2003とかでもありましたけど?」とさらに馬鹿にされました。

挙句に「SASではどう書くんですか?」と聞かれ「え、そんなんできたかな?ちょっとわかんない」と答えると、「SASが書けるだけが取り柄なのに全然駄目じゃないですか」と軽蔑の眼差しを向けられてしまいました。

家に帰って、泣きながら調べてみると、あったよ、smoothconnectオプション。
でも9.4からか、結構最近だなぁ。

適当にデータ作って

data Q1;
    call streaminit(777);
    do X=1 to 20;
        Y=rand('uniform');
        output;
    end;
run;

まずは普通にプロット

proc sgplot data=Q1;
    series x=X y=Y/ lineattrs=(thickness=2);
run;






















で、次に

proc sgplot data=Q1;
    series x=X y=Y/smoothconnect lineattrs=(thickness=2);
run;





















おぉ!できた!できたよ!

ちなみにGTLで表現するなら

proc template;
  define statgraph temp1;
     begingraph; 
     layout overlay;
        seriesplot x=X y=Y / lineattrs=(tickness=2)
         smoothconnect=true;
     endlayout;  
   endgraph;
 end;
run;

proc sgrender data=Q1 template=temp1;
run;























で同じだと思う。


ちなみに、また別記事にするかもですが、データ数が多い場合、細かい部分で線が表現しきれず
ドットぽくなってしまうことがあります。
またwaterfallpltのようなぴったりくっついた棒グラフを書きたいのになんか一部に変な隙間ができたりすることもあります。
そういう、細かい部分で生じるアラ?を補正にするにはsubpixelオプションを使います。
今回のグラフでも、画質マニアなら


proc sgplot data=Q1 subpixel;
    series x=X y=Y/smoothconnect lineattrs=(thickness=2);
run;

または

proc template;
  define statgraph temp1;
     begingraph/subpixel=on
     layout overlay;
        seriesplot x=X y=Y / lineattrs=(tickness=2)
         smoothconnect=true;
     endlayout;  
   endgraph;
 end;

proc sgrender data=Q1 template=temp1;
run;

とすると






















うん、やっぱこの程度のグラフだと素人には違いがさっぱりわかりませんね


GTLの中でeval関数を使うことによって、SAS関数を使えて、動的なテンプレート定義ができたりする話

ちょっとした話です。

data Q1;
call streaminit(777);
 do Z= 1 to 10;
  X=rand('uniform');Y=rand('uniform');
  output;
 end;
run;


















GTL、テンプレート定義は基本的に静的なもので、
dynamicステートメントやマクロで値を渡す以外は、template内で実行時に
変更を伴う動的な処理はできないのですが
evalを使うとSAS関数が使えるので、

proc template;
 define statgraph G1;
 begingraph;
 layout overlay;
  scatterplot x=X y=Y
    /name='n1'
     markerattrs=(size=11 weight=bold symbol=circlefilled)
     group=eval(ifc(Z<=5,'low','high'));
   discretelegend 'n1'/title='Z'
                        location=inside halign=right valign=bottom;
  endlayout;
  endgraph;
  end;
 run;

 proc sgrender data=Q1 template=G1;
 run;






















のように予めグループ化用の変数を用意してなくても、データから条件を付けて
ダイレクトにグループ化したりできます。

或いは、よく使うのが、グラフに参照線入れる時に、mean関数とかで、平均値とか
要約統計量を使いたい場合とかですかね。