座標軸描画ルーチンのさらに進んだ機能を見てみましょう.おそらく,誰の要 求も満たしてくれることと思います.
「好みの間隔で目盛りをうち,好みのところにラベルを描く.しかも,ラベル には数字だけでなく文字列も使いたい.」 そのような要求にも U[XYZ]PACK の パッケージは柔軟に対応できます.
スケーリングは前章の例 UXYZ4 と同じで,緯度のラベルは文字列で表 現し,また圧力の目盛はデータが存在するレベルだけに打つというプログラム が,UXYZ5 です.
uxyz5.f: frame1
目盛とラベルを描く場所を指定して座標軸を描くサブルーチンとして,UXAXNM, UYAXNM があり,さらに,描くラベルも指定するルーチンに UXAXLB, UYAXLB があります.この例では,後者を使っています. 最初の引数は場所を指定する引数です.2, 3番目の引数では,小さめの目盛り をうつ場所に関する情報を指定します.2番目の引数は,小さい目盛りをうつ 場所のU座標系での値を与える実数型配列で,3番目はその配列の長さです. 4 番目から7番目までの引数では,同様にして,大きめの目盛りについての情報 を与えます; 目盛りをうつ場所を指定する配列,ラベルを指定する文字型配列, ラベルの文字数,配列の長さ,の順に与えます.これらの情報は,8行めから のデータ文で用意しています.
なお,ラベルとして与える文字列の有効な長さは,後方のブランクを無視して 数えます.具体的には,x軸の 'EQ□□' のように,DATA文では後方 に2文字のブランクを含んで文字列を与えても,先行する有効な2文字のみがラ ベルの作画対象となり,2文字分がセンタリングされて作画されます.y軸に 関しても同様に,文字列 '.4□□' なども後方のブランクを無視して右 寄せして描かれます.
小さい目盛りを描きたくない場合には,この例の UYAXLB のように,小 さい目盛りの配列を与えるべきところに適当な変数名(ここではDUMMY) を書いておいて,その配列の大きさを0と指定すれば大丈夫です.
これまで,同じ座標軸作画ルーチンを呼んでも,下側と左側にはラベルを描き, 上側と右側は目盛だけでラベルは描きませんでした.左右両方に異なったラベ ルの座標軸を描きたい時にはどうすれば良いのでしょう(UXYZ6).
座標軸のラベルを描くか描かないかは,UZPACK の管理する内部変数によって 制御されています.この例のように,右側の座標軸に関しては 'UZLSET' ルーチンで 'LABELYR' という内部変数を .TRUE. に することによって,右側の座標軸についてもラベルが描けます.左側は 'LABELYL', x軸の上と下はそれぞれ,'LABELXT', 'LABELXB' によって制御されています.
uxyz6.f: frame1
右側の座標軸は UYAXDV によって描きました.13行めで UYMIN が RND(=720), UYMAX が 0.0 とウインドウを指定したので,ラ ベルの値が上から下に増えています.また,UZISET ルーチンで内部変 数 'IROTCYR' を-1にしたので,UYSTTL で描いた 'DAY NUMBER' という座標軸のタイトルも180度回転しています.この回転角の値は, 90度を単位とする整数値で指定します.
左側の座標軸は UCYACL ルーチンで描いたのですが,この例からわかる ように,日数のラベルが描けないような場合には,適当に判断して月と年の目 盛だけが描かれます.なお,UCXACL/UCYACL の下位ルーチンを呼ぶこと によって,日, 月,年の座標軸を別々に描くこともできます.
なお,この例では10行めでUZFACT を呼んで,文字や目盛のサイズを全 体的に小さく(デフォルトの0.8倍)して座標軸を描いています.
座標軸は 'B', 'T', 'L', 'R' で指定する 以外のところにも描くことができます.また,軸の表現もいろいろ変えられま す(UXYZ7).
uxyz7.f: frame1
座標軸をウインドウ・ビューポートの境界線以外のところへ描きたいときには, 場所をあらわす引数としてユーザー指定の座標軸 'U' を指定します. この例では UXAXDV と UXSTTL のサブルーチンで 'U' を 指定して,座標軸とタイトルを描いています.具体的にどこに軸を描くかは, UZRSET ルーチンを用いて,x軸については内部変数 'UYUSER' の値を,y軸については内部変数 'UXUSER' の値を指定ます.この例 の場合,'UYUSER' を0.0と指定することによって,U-座標系でみたy 座標の値が0.0のところにユーザー指定のx軸を描きます.
また,この例のx軸では,目盛と目盛の間にラベルを描いてみました.UZLSET ルーチンで内部変数 'LBTWN' を .TRUE. とすれば,目 盛と目盛の間にラベルを描きます.ただし,注意すべきことは,ほかの座標軸 を描くときにもこの設定が影響しますので,ラベルを描き終ったら .FALSE.(初期値)に戻しておく必要があります.
さらに,17行めの UXSFMT ルーチンによってフォーマットを '(I4)' と陽に指定しています.これは,デフォルトでは有効数字3桁で数値 を表現するフォーマットとなっているためで,4桁目までちゃんと表現する必 要があるときには,このようにユーザーがフォーマットを指定しなければなり ません.
y軸では,UZISET で内部変数 'INNER' を-1に設定して,目 盛を外向きにつけました.(初期値は1で,内向きに目盛をつけます.)また, UYSFMT ルーチンによってフォーマットを '(F4.1)' と陽に指定し ました.
最後のプログラム UXYZ8 では,同じ側に2本以上の座標軸を別の目盛 で描こうという時の実例です.
軸を外側へずらしたい,または,すでに描いた軸の外側にもう一本軸を描きた いというときは,x軸については UXSAXS ルーチンを,y軸について は UYSAXS ルーチンを呼ぶだけです.引数は,場所を指定するおなじみ の引数です.これらのルーチンを呼ぶと,次の軸は内側の軸と重ならない程度 に適度に外側に描かれます.これを何回も使えば,簡単にいくつもの軸を一つ の側に描かせることができます.
1つの側に複数の軸を描こうとする時, そのためにいちいちウインドウを設定 し直す必要はありません.この例では,y座標のウインドウとしてセ氏温度 で0度から100度の範囲で設定したのですが,換算の便のためにケルビンやカ氏 の目盛りもあわせて描いています.ウインドウ設定に影響を与えず,目盛りだ けを変えて複数の座標軸を描きたいときは,オフセット機能を用います.その ためにまず UZLSET ルーチンで内部変数 'LOFFSET' を .TRUE. にしておきます.そして,必要なところで,UZRSET ルーチン で内部変数 'YOFFSET' と 'YFACT' (x軸については 'XOFFSET' と 'XFACT')を設定すると,目盛の位置が 'YOFFSET' だけ平行移動し,目盛の間隔が 'YFACT' 倍されます.
uxyz8.f: frame1
NUMAGUTI Atusi <a1n@gfdl.gov> Last Modified: Thu Aug 31 13:11:56 EDT 1995