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 ;