2020年8月1日土曜日

SGPLOTでバタフライプロットを書く話

最近グラフおじさん化していますが世の中のグラフの種類の多さにたまげる毎日です.知らないグラフがいっぱいある.困る.今回はバタフライプロットをSGPLOTで書いてみます.我流なのでもっといい方法があるかもしれません.もっと違う書き方あるよってご存じの方はぜひコメントにて教えてください.

バタフライプロットとは以下のような真ん中から両端に向かって伸びる棒グラフです.見たことはありましたが先日初めて名前をしりました.

 
早速上のグラフを書いたプログラムを貼りますが,x軸は頻度なのでまず数えます.頻度を出したデータの内,左側(青い方)に出したいものは-1をかけて頻度を無理やり負の数にします.そのままSGPLOTに読み込ませて,x軸ラベルの表示を正の数に変えれば完成です.
 
proc freq data= sashelp.class noprint;
  tables sex * age / out = V_CLASS ;
run ;
 
data V_BF ;
    set V_CLASS ;
 
    if SEX = "男子" then do ;
        V_CNT = COUNT * -1 ;     /*頻度を負の値に変換*/
        V_SEX = 1 ;
    end ;

    if SEX = "女子" then do ;
        V_CNT = COUNT ;     /*頻度はそのまま*/
        V_SEX = 2 ;
    end ;
run ;
 
proc sgplot data = V_BF  ;
    hbar AGE / response=V_CNT group = V_SEX barwidth = 1.0;
 
    xaxis
        values=(-5 to 5 by 1)  /*データ上は-5から5まで*/
        valuesdisplay=("5" "4" "3" "2" "1" "0" "1" "2" "3" "4" "5") /*メモリの表示を指定*/
    ;
    yaxis
        values = (10 to 20 by 1)
        grid   /*格子線あった方が多分見やすい*/
        reverse  /*y軸の値の並びを大から小にする*/
    ;
run ;
 
マイナスでデータを持たせて左右に表示して,軸のメモリ表示は正の値として指定するのってなんだかイマイチな気がします.わざわざ手でメモリ値を指定するのて結構煩雑ですし…いい感じに指定する方法があればいいんですが,どなたかご存じないですか?

 

2 件のコメント:

  1. GTLですが、以下の記事でご紹介しています。

    https://superman-jp.hatenablog.com/entry/SAS-GTL-butterfly-chart

    返信削除
    返信
    1. おおーありがとうございます.見てみます.
      私はGTLをあまり使ったこと無いですが,GTLの方が設定がやりやすくていいところがありますよね.

      削除