8.1 注文の多い目盛りうち

「好みの間隔で目盛りをうち, 好みのところにラベルを描く. しかも, ラベル には数字だけでなく文字列も使いたい.」 そのような要求にも U[XYZ]PACK の パッケージは柔軟に対応できます.

スケーリングは前章の例 uxyz4 と同じで, 緯度のラベルは文字列で表 現し, また圧力の目盛はデータが存在するレベルだけに打つというプログラム が, uxyz5 です.

# uxyz5.rb


require "narray"
require "numru/dcl"
include NumRu
include Math


nx1 = 21
nx2 = 5
ny1 = 0
ny2 = 18

rx1 = NArray.sfloat(nx1)
rx1.indgen(-50.0, 5.0)

rx2 = NArray.sfloat(nx2)
rx2.indgen(-40.0, 20.0)

cx2 = ['40S ','20S ','EQ  ','20N ','40N ']

ry2 = NArray[1000.0, 850.0, 700.0, 500.0, 400.0, 300.0, 250.0, 200.0,
               150.0, 100.0, 70.0, 50.0, 30.0, 10.0, 5.0, 2.0, 1.0, 0.4]

cy2 = ['1000','    ','    ','500 ','    ','    ','    ','200 ','    ',
       '100 ','    ','50  ','30  ','10  ','5   ','2   ','1   ','.4  ']

dummy = []


#-- graph ---
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;';DCL:: sgpwsn; gets)).to_i
DCL::gropn iws

DCL::grfrm

DCL::grswnd(-50.0, 50.0, 1.0e3, 0.4)
DCL::grsvpt(0.2, 0.8, 0.2, 0.8)
DCL::grstrn(2)
DCL::grstrf

DCL::uxaxlb('B', rx1, rx2, cx2, 4)
DCL::uxaxlb('T', rx1, rx2, cx2, 4)
DCL::uxsttl('B', 'LATITUDE', 0.0)

DCL::uyaxlb('L', dummy, ry2, cy2, 4)
DCL::uyaxlb('R', dummy, ry2, cy2, 4)
DCL::uysttl('L', 'PRESSURE (hPa)', 0.0)

DCL::uxmttl('T', 'UXAXLB/UYAXLB', 0.0)

DCL::grcls

program uxyz5

\resizebox{10cm}{!}{\includegraphics{uxyz2/uxyz5.eps}}
uxyz5.rb: frame1

目盛とラベルを描く場所を指定して座標軸を描くメソッド(元サブルーチン)として, uxaxnm, uyaxnm があり, さらに, 描くラベルも指定するルーチンに uxaxlb, uyaxlb があります. この例では, 後者を使っています. 最初の引数は場所を指定する引数です. 2, 3番目の引数では, 小さめの目盛り をうつ場所に関する情報を指定します. 2番目の引数は, 小さい目盛りをうつ 場所のU座標系での値を与える実数型配列で, 3番目はその配列の長さです. 4 番目から7番目までの引数では, 同様にして, 大きめの目盛りについての情報 を与えます; 目盛りをうつ場所を指定する配列, ラベルを指定する文字型配列, ラベルの文字数, 配列の長さ, の順に与えます. これらの情報は, 8行めから のデータ文で用意しています.

なお, ラベルとして与える文字列の有効な長さは, 後方のブランクを無視して 数えます. 具体的には, x軸の 'EQ□□' のように, DATA文では後方 に2文字のブランクを含んで文字列を与えても, 先行する有効な2文字のみがラ ベルの作画対象となり, 2文字分がセンタリングされて作画されます. y軸に 関しても同様に, 文字列 '.4□□' なども後方のブランクを無視して右 寄せして描かれます.

小さい目盛りを描きたくない場合には, この例の uyaxlb のように, 小 さい目盛りの配列を与えるべきところに適当な変数名(ここではdummy) を書いておいて, その配列の大きさを0と指定すれば大丈夫です.