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

2023年8月24日木曜日

正方形のplotを描画する話

 たまに散布図を出力するときにplotを正方形にしてください、と依頼を受けることがあります。気持ちはわかるがどうすんねんという話ですが、ちょうどsgplotステートメントにaspectオプションがあり、これに 1を指定するとplotが正方形になります。aspectオプションは0-1の幅で指定できます。

詳細はsasのヘルプページのASPECT=positive-number欄に記載があります。

specifies the aspect ratio of the plot’s wall area. The ratio is expressed as a positive decimal fraction representing wall-height divided by wall-width. For example, 0.75 is a 3/4 aspect ratio, and 1.0 is a square aspect ratio.

Small numbers, such as 0.01, produce a short, wide rectangular area. Larger numbers yield a taller, narrower rectangular area.

https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/grstatproc/p073bl97jzadkmn15lhq58yiy2uh.htm#p00zvhaib2skg9n10khojgxdigzh



以下プログラム

data FDAT ;

    call streaminit(1234) ;

    do i = 1 to 10 ;

        AVAL = rand('uniform') *100 ;

        output ;

    end ;  

run ;

%let _out = %sysfunc(getoption(work)) ;

ods listing gpath = "&_out" ;

ods graphics on / reset= all noborder imagename = "test" imagefmt= png ;

proc sgplot data = FDAT nowall noautolegend aspect = 1 ;

    scatter x = I y = AVAL ;

run ;

2023年6月6日火曜日

散布図のマークをハイフンにする話

 sgplotでは散布図のシンボルをcircleなりsquareなりの指定で色々な形を出力することができます。具体的にはscatterステートメントのmarkerattrsです。例えばmarkerattrs = (symbol = circle)とすると散布図のシンボルが白丸になります。ここでmarkerattrs = (symbol = circle color = black)としてやると黒い白抜きの丸ですね。その他にどんな指定ができるのかは以下のsashelpに記載があります。
https://documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/grstatproc/p0i3rles1y5mvsn1hrq3i2271rmi.htm

それで終われば話が早いのですが、このsashelpに記載のないシンボル例えば「-を出したいときの紹介です。
markerchar
オプションを使うと任意の文字列をシンボルに出来るのですが、なんとこのオプションは「specifies a variable whose values replace the marker symbols in the plot. 」とあるので、MARKERCHAR=変数名と指定しないといけません。要はシンボルの文字列を格納した変数を別途sgplotに読み込ませるデータに作らないといけません。以下のフォーラムでもデータセットにシンボル用の変数を作成する旨が解決策として示されています。ちょうど「-」をMEANSYMBOLという変数に格納しているようです。
https://communities.sas.com/t5/Graphics-Programming/PROC-SGPLOT-SCATTER-PLOT-and-quot-quot-as-SYMBOL/td-p/133064

もちろんこれでも問題ないのですが、私としてはシンボル用の文字列をデータセットに持たせるのはあまり好みではありません。そこで別の手段としてsymbolcharステートメントを使います。scatter ... / markerattrs = (symbol = sym1)とします。sym1の文字列はなんでもいいです。次にsymbolcharステートメントを使ってsymbolchar name = sym1 char = "002D"x ; とします。symbolcharのnameにはmarkerattrsで指定したものと同じ文字列を指定してください。今回で言うとsym1です。char = "002D"xの部分でユニコードでの「-」を指定しています。symbolcharのcharではユニコードが通るのがミソですね。今回は-ですが違うユニコードを指定すれば当然違う文字列をシンボルに出来ます。あまり色んな文字をシンボルにしたくはないのですがたまにはやむを得ないということで…

--指定の例--

scatter x = hoge y = piyo
  / markerattrs = (symbol = sym1)

symbolchar name = sym1 char = "002D"x ;

2021年7月16日金曜日

warterfall plotの棒が少ない時に間隔を狭くする話

 オプションの一発で解決する内容なのですが,機会があったので話のネタにしようと.…身バレしそうやけどこんな場末ブログ誰も見とらんやろ

以下のような3本しかbarが出てないので間隔が広いのがどうにかならんかと言われたとします.


こういう時は私はxaxisステートメントのoffsetmin/maxで調整しています.ほかにいい方法があるかもしれませんが.今回だとoffsetmin = 0.3    offsetmax = 0.3 くらいを指定すると以下の図になり多少は棒の間隔がマシになります.今回は0.4まで広げると個人的に見た目がイマイチだったので0.3か0.35くらいですかね.正直間隔が広くてもええやろって思うのですがなかなか許してもらえない


この状態で棒の幅をvbarステートメントでbarwidth = 1.0を指定すると,以下の感じに棒の
間隔そのものがなくなります.offsetmin/maxである程度見た目整えて,微調整をbarwidthでやるようにしています.初めて棒くっつけろ言われた時はどうしようか悩んだのが懐かしいですね.頼むから余計なリクエスト言わんでくれ…


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 ;
 
マイナスでデータを持たせて左右に表示して,軸のメモリ表示は正の値として指定するのってなんだかイマイチな気がします.わざわざ手でメモリ値を指定するのて結構煩雑ですし…いい感じに指定する方法があればいいんですが,どなたかご存じないですか?

 

2020年6月15日月曜日

sgplotでemfファイルを出力する話

何回やっても次やるときにすっかり忘れて自分のプログラムを探す羽目になるのでここをメモ代わりにします.私以外の人に需要は無いと思いますがそんなことは知らぬ

sas9.4のsgplotで出力をemfファイルで出したい時の設定です.いっつもpngとかで出しがちなので覚えてないんですよね…emfにもいいところはあるのですが.

以下プログラム

/*----- 適当なデータ -----*/
data hoge ;
    call streaminit(1234) ;
    do X = 1 to 36 by 1 ;
        Y = int(rand("uniform") * 100) ;
        output ;
    end ;
run ;

ods html close ;   *--htmlをcloseしないとwarninig出る;
ods listing gpath = "hogehoge" ;
ods graphics on / reset = all imagename="hist1" imagefmt=emf ;

proc sgplot data = hoge nowall noborder ;
    vbar X / response = Y ;

    xaxis
        values = (1 to 25 by 1)
        label="発現時期"
    ;

    yaxis
        label="発現率(%)"
        values = (0 to 100 by 20)
    ;

run ;

ods graphics off ;
ods listing close ;
ods html ;  *-- 元に戻す ;

2020年3月1日日曜日

棒グラフをsgplotで出す話

ある日質問されて答えられなかったのでここに供養します.ピンとこなかった自分が悲しい.

sgplotで棒グラフを書く時のサンプルです.vbarステートメントを使って出力するのですが,詳細は以下のプログラムの通りです.あんまり凝ったことしてなくほんとにただの紹介なのであまり目新しいことはないですが...軸ラベルが適当ですみません

変数Yの平均値を書いているのですが,オプションでmeanを指定すればOKなのと,標準偏差のヒゲをはやしているのですがこれもオプションで書けます.わざわざ出力用データセットに平均値と標準偏差を持たなくて良いのは楽ですね.確認の具合もあるので何でもかんでもオプションで出せばいいという訳ではありませんが…データに持たせた標準偏差を使ってヒゲをannotateで書かそうとする奴は敵です.

/*以下プログラム*/

data HOGE;
    call streaminit(12);
    do i = 1 to 10 ;
        Y = int(rand('uniform') *100) ;
        if 1 <= i <= 5  then GR = 1 ;
        if 6 <= i <= 10 then GR = 2 ;
        output;
    end;
run;

ods graphics / imagename="bar" imagefmt=png ;
ods listing gpath = "hogehoge" ;
ods html close ;

proc sgplot data = hoge noautolegend nowall noborder ;
    styleattrs datacolors = (gray white) ;
    vbar GR / group = GR groupdisplay = cluster
              response = Y stat = mean nozerobars   /*Yの平均値の棒を立てる*/
              barwidth = 0.5
              limits = upper limitstat = stddev          /*Yの標準偏差のひげを生やす*/
    ;
    xaxis type=DISCRETE ;                              /*不要*/
run ;

ods graphics / reset = all ;
ods html ;

2019年10月1日火曜日

グラフの背景にgrid線を入れる話

グラフをsgplotで書く時に,軸のメモリごとの格子線を背景に入れるオプションの紹介です.英語だとbackgroundgridですかね.これが見つからなくてちょっと時間かかったんですよね...意外とこの手の微妙なオプションがなかなか紹介されていなくて辛い.

yaxis/xaxisステートメントにgridオプションを指定すると目的の格子線が入ります.
例えば以下の画像だとy軸のメモリごとにうっすら格子線が入っています.通常だとこんな線はなく背景は真っ白ですね

/*-以下プログラム-*/
data HOGE ;
    do i = 1 to 5 ;
        X = i ;
        Y = x ;
        output ;
    end ;
run ;
   
proc sgplot data = HOGE;
    series x = X y = Y ;
   
    xaxis
        offsetmax=0.05
        offsetmin=0.05
    ;
    yaxis
        grid  /*これがgridを出すオプション--xaxisにも同じ指定が可能*/
        offsetmax=0.05
        offsetmin=0.05
    ;
       
run ;

2018年10月1日月曜日

sgplotで使うsymbolの紹介

SGPLOTでグラフを書く時,群毎にグラフにsymbolを出すことがあると思います.
どんなsymbolが使えるかをすぐ忘れてしまうので紹介します.
よく使うのは丸と四角と三角ですかね.下の図に乗せています.

その他のはonline docを参照してください.
https://documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=9.4_3.3&docsetId=grstatproc&docsetTarget=p0i3rles1y5mvsn1hrq3i2271rmi.htm&locale=ja

/*test data*/
data HOGE ;
  do G = 1 to 6 by 1 ;
    do A = 1 to 3 ;
      B = G ;
      output ;
    end ;
  end ;
run ;

proc sgplot data = HOGE noautolegend ;
  styleattrs
    datasymbols=(Circle CircleFilled Square SquareFilled Triangle TriangleFilled)
    datacontrastcolors=(black)
    datalinepatterns=(solid)
  ;
  series X = A Y = B
    / group = G markers
  ;
 
run ;


2018年3月3日土曜日

グラフのラベルに改行を入れる話

SASでグラフを出す時に,軸のラベルや軸目盛の値の改行をするにはannotateをするしかない,と思っていました.
ところがどっこいaxisステートメントの指定の仕方で改行できるようです.
軸ラベルを改行させてほしいとリクエストが来るたびに,相手のことを呪っていたわけですが
これからはそんな呪いからも解放されますね.

sgplotで軸目盛のラベルの改行は出来たのですが,軸そのものへのラベルの改行のやり方が分からないのが次なる課題ですね...

/*---------- testデータ ----------*/

data hoge;
    call streaminit(11);
    do A=1 to 5;
        Y = int(rand('uniform') *10 );
        output;
    end;
run;

*---------- gplotでの場合 ;
proc gplot data = hoge;
    plot Y * A / vaxis = axis1 haxis = axis2 ;
    symbol1 c = black V = dot I = join;

    *---------- y軸目盛;
    axis1
      order = (0 to 5 by 1)
      origin=(10, 30)
      ;

    *---------- x軸目盛;
    axis2
      order=( 1 to 5 by 1 )
      origin=(10, 30)
      label=("x軸" j = c "ラベル")
      value=(tick = 1 "1" j = c "時間" j=c "経過"
             tick = 2 "2" j = c "時間" j=c "経過"
             tick = 3 "3" j = c "時間" j=c "経過"
             tick = 4 "4" j = c "時間" j=c "経過"
             tick = 5 "5" j = c "時間" j=c "経過"
            )
    ;
 run;

gplotでの出力イメージ












*---------- sgplotでの場合 ;
proc sgplot data = hoge  ;
    series x = A y = Y  ;

    xaxis
      type  = discrete
      fitpolicy=splitalways
      splitchar="*"
      label="x軸ラベル"
      values=(1 2 3 4 5)
      valuesdisplay=("1*時間*経過" "2*時間*経過" "3*時間*経過" "4*時間*経過" "5*時間*経過")
    ;   
run ;

sgplotでの出力イメージ

2017年10月2日月曜日

sgplotを実行した時に,自動でグラフのイメージが出力される話

改めて見るとよくわからないタイトルですね.適当よくない

sgplotでグラフを書くと,グラフのイメージが勝手にpng形式で出てきて困ってました.
ods rtfでrtf形式を指定しているので,改めてpngは要らないのです.
そういう時は「ods listing close ;」でpngの出力止めれますよ,と言う簡単な話です.

それか出力先を自分のsasのworkにしてしまえば,
sasを落とせば勝手に消えるし出力の確認もできます.
workをこんな使い方していいのかは知りませんが.

*----- pngの出力止める(outputへの出力を止める) ;
ods listing close ;

*----- rtf出力start ;
ods rtf file = "hogehoge\test.rtf" ;

proc sgplot data = sashelp.class ;
     vbox HEIGHT / category = SEX ;
run ;

ods rtf close ;
ods listing ;


/*---------- 出力をworkにする ----------*/
%let _wk = %sysfunc(getoption(work));
%put &=_wk ;

*----- outputの出力先を指定 ;
ods listing gpath = "&_wk."