SAS

GTLでプロットエリアを塗り分ける(1) polygonplotステートメント

プロットエリアは通常すべて背景色が同じですが、特定の部分だけ色を付けて強調する必要があったので、作図方法を考えました。

作図方法はblockplotやlinechartなどいくつかあるのですが、polygonplotステートメントを使う方法が一番だという結論に至りました。

polygobplotステートメント

polygonplotステートメントは多角形を描くステートメントです

polygonplot x=x座標 y=y座標 id=図形識別コード /;

多角形の頂点の座標を格納した変数と、各図形の識別コードを指定するだけです。
多角形は塗りと透過度の設定ができるので、プロットエリアの任意の範囲を塗ることができます。また塗る範囲は長方形でなくても描くことができます。

座標平面を象限毎に塗り分ける

二次元座標で各象限の違いを強調したいとき、各象限を色分けするとわかりやすいです。

polygonplotを作図するデータを作成し、それをpolygonplotステートメントで指定するだけです。なおlabelオプションを指定すると多角形の任意の位置にラベルを表示させることができます。デフォルトでは図形の中心に設置されるようです。

今回はロバート・キヨサキの本で語られていたキャッシュフロークアドラントの図を描いてみます。臨床統計全然関係ないけど

/*長方形の各頂点の座標*/ 

data test; 
length group $10; 
input group $ x y; 
cards; 

B 0 0 
B 100 0 
B 100 100 
B 0 100 
E 0 0 
E 0 100 
E -100 100 
E -100 0 
S 0 0 
S -100 0 
S -100 -100 
S 0 -100 
I 0 0 
I 100 0 
I 100 -100 
I 0 -100 
;
run; 

proc template; 
define statgraph polygon; 
begingraph; 
   layout overlay/ 
      xaxisopts=(linearopts=(origin=0)) 
      yaxisopts=(linearopts=(origin=0)); 

   polygonplot x=x y=y id=group / 
      group=group 
      display=(fill) 
      label=group 
      labelattrs=(size=20 color=black) 
      fillattrs=(transparency=0.6); 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=test template=polygon; 
run;
実行結果

axisオプションでorigin=0とすることで軸の原点を設定することができます。上記のようにすると座標の原点はプロットエリアの中心に配置されます。

臨床統計というよりはマーケティングとかに使えそうなテクニックですね。

ちなみにBはbusiness owner,Eはemployee, Sはself employed, IはInvestorらしいです。

ぶっちゃけロバート・キヨサキはかなり胡散臭いと思っています。Investorやbusiness ownerを目指すように主張してますけど、どっちも労働していることには変わりませんし、むしろ一般労働者よりも働いてますから楽じゃないですよ。それにその2者しかいなかったら世のなか回りませんよ?

blockplotはY軸方向への塗り分けはできない

同様のことはblockplotでもできそうですが、blockplotはy軸の情報は作図できないため、x軸の範囲を指定するとy軸全体まで塗られてしまいます。ただしx軸のみ色分けしたい場合はblockplotステートメントのほうが少ないデータで作図できます。使い分けが大事です。

blockplotステートメントで時系列データを時期別に色分けする以下のグラフは東京都の新型コロナウィルス陽性患者の人数の推移をプロットしたものです。 東京都の新型コロナウィルス陽性患者人数 ...

linechartでも塗り分けることができけど・・・

linechartステートメントはラインの下を塗りにすることができるため、linechartを使って塗り分けしてみました。displayオプションで塗りだけを表示するようにすれば似たようなことができます。polygonplotよりは少ないデータで塗り分けることができる点は良かったのですが・・・

data test2; 
input group x y ; 
cards; 
1 0 100 
1 100 100 
2 0 100 
2 -100 100 
3 0 -100 
3 -100 -100 
4 0 -100 
4 100 -100 
; 
run; 

proc template; 
define statgraph line; 
begingraph; 
   layout overlay / 
      xaxisopts=(linearopts=(origin=0)) 
      yaxisopts=(linearopts=(origin=0)); 

      linechart category=x response=y/ 
         group=group 
         display=(fill) 
         fillattrs=(transparency=0.6); 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=test2 template=line; 
run;
実行結果

Y軸の原点の設定が反映されませんでした。あとグラフエリアの余白がこちらのほうが広いです。pylogonplotとはちょっと違う。

いずれにしてもラベルは設置できないですし、Y軸方向の塗りはやはり苦手な印象を受けるので、実用性は低いです。

まとめ

プロットエリアを塗り分けたいときはpolygonplotステートメント一択です。特にY軸方向の塗り分けはpolygonplotでないと難しいでしょう。

X軸方向のみを塗り分けたい場合(Y軸方向は同じ塗りになる)はblockplotステートメントのほうが少ないデータで作図することができます。