%表題   らくらく電能ライブラリ
%
%履歴
%\Drireki{
%         95/04/13 余田 成男
%        }
%
%\Dchapter{もっと座標軸}
\Dchapterhead


座標軸描画ルーチンのさらに進んだ機能を見てみましょう. おそらく, 誰の要
求も満たしてくれることと思います.

%-----------------------------------------------------------------------
\section{注文の多い目盛りうち}

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

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

\Dproginput{uxyz2/uxyz5.f}

\begin{center}
\Depsf[10cm]{uxyz2/uxyz5_0001.eps}\\
{\bf uxyz5.f: frame1}\\
\end{center}

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

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

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


%-----------------------------------------------------------------------
\section{右も左も日付軸}

これまで, 同じ座標軸作画ルーチンを呼んでも, 下側と左側にはラベルを描き,
上側と右側は目盛だけでラベルは描きませんでした. 左右両方に異なったラベ
ルの座標軸を描きたい時にはどうすれば良いのでしょう({\tt UXYZ6}).
\vspace{1em}

座標軸のラベルを描くか描かないかは, UZPACK の管理する内部変数によって
制御されています. この例のように, 右側の座標軸に関しては {\tt
'UZLSET'} ルーチンで {\tt 'LABELYR'} という内部変数を {\tt .TRUE.} に
することによって, 右側の座標軸についてもラベルが描けます. 左側は {\tt
'LABELYL'}, $x$軸の上と下はそれぞれ, {\tt 'LABELXT'}, {\tt 'LABELXB'}
によって制御されています.

\Dproginput{uxyz2/uxyz6.f}

\begin{center}
\Depsf[10cm]{uxyz2/uxyz6_0001.eps}\\
{\bf uxyz6.f: frame1}\\
\end{center}

右側の座標軸は {\tt UYAXDV} によって描きました. 13行めで {\tt UYMIN}
が {\tt RND}(=720), {\tt UYMAX} が 0.0 とウインドウを指定したので, ラ
ベルの値が上から下に増えています. また, {\tt UZISET} ルーチンで内部変
数 {\tt 'IROTCYR'} を$-1$にしたので, {\tt UYSTTL} で描いた {\tt 'DAY
NUMBER'} という座標軸のタイトルも180度回転しています. この回転角の値は,
90度を単位とする整数値で指定します.
\vspace{1em}

左側の座標軸は {\tt UCYACL} ルーチンで描いたのですが, この例からわかる
ように, 日数のラベルが描けないような場合には,適当に判断して月と年の目
盛だけが描かれます. なお, {\tt UCXACL/UCYACL} の下位ルーチンを呼ぶこと
によって, 日, 月, 年の座標軸を別々に描くこともできます.
\vspace{1em}

なお, この例では10行めで{\tt UZFACT} を呼んで, 文字や目盛のサイズを全
体的に小さく(デフォルトの0.8倍)して座標軸を描いています.

%-----------------------------------------------------------------------
\section{好みの場所に好みの軸を}

座標軸は {\tt 'B'}, {\tt 'T'}, {\tt 'L'}, {\tt 'R'} で指定する
以外のところにも描くことができます. また, 軸の表現もいろいろ変えられま
す({\tt UXYZ7}).

\Dproginput{uxyz2/uxyz7.f}

\begin{center}
\Depsf[10cm]{uxyz2/uxyz7_0001.eps}\\
{\bf uxyz7.f: frame1}\\
\end{center}

座標軸をウインドウ・ビューポートの境界線以外のところへ描きたいときには,
場所をあらわす引数としてユーザー指定の座標軸 {\tt 'U'} を指定します.
この例では {\tt UXAXDV} と {\tt UXSTTL} のサブルーチンで {\tt 'U'} を
指定して, 座標軸とタイトルを描いています. 具体的にどこに軸を描くかは,
{\tt UZRSET} ルーチンを用いて, $x$軸については内部変数 {\tt 'UYUSER'}
の値を, $y$軸については内部変数 {\tt 'UXUSER'} の値を指定ます. この例
の場合, {\tt 'UYUSER'} を0.0と指定することによって, U-座標系でみた$y$
座標の値が0.0のところにユーザー指定の$x$軸を描きます.
\vspace{1em}

また, この例の$x$軸では, 目盛と目盛の間にラベルを描いてみました. {\tt
UZLSET} ルーチンで内部変数 {\tt 'LBTWN'} を {\tt .TRUE.} とすれば, 目
盛と目盛の間にラベルを描きます. ただし, 注意すべきことは, ほかの座標軸
を描くときにもこの設定が影響しますので, ラベルを描き終ったら {\tt
.FALSE.}(初期値)に戻しておく必要があります.
\vspace{1em}

さらに, 17行めの {\tt UXSFMT} ルーチンによってフォーマットを {\tt
'(I4)'} と陽に指定しています. これは, デフォルトでは有効数字3桁で数値
を表現するフォーマットとなっているためで, 4桁目までちゃんと表現する必
要があるときには, このようにユーザーがフォーマットを指定しなければなり
ません.
\vspace{1em}

$y$軸では, {\tt UZISET} で内部変数 {\tt 'INNER'} を$-1$に設定して, 目
盛を外向きにつけました. (初期値は1で, 内向きに目盛をつけます.) また,
{\tt UYSFMT} ルーチンによってフォーマットを {\tt '(F4.1)'} と陽に指定し
ました.


%-----------------------------------------------------------------------
\section{同じ側に何本もの軸を}

最後のプログラム {\tt UXYZ8} では, 同じ側に2本以上の座標軸を別の目盛
で描こうという時の実例です.
\vspace{1em}

軸を外側へずらしたい, または, すでに描いた軸の外側にもう一本軸を描きた
いというときは, $x$軸については {\tt UXSAXS} ルーチンを, $y$軸について
は {\tt UYSAXS} ルーチンを呼ぶだけです. 引数は, 場所を指定するおなじみ
の引数です. これらのルーチンを呼ぶと, 次の軸は内側の軸と重ならない程度
に適度に外側に描かれます. これを何回も使えば, 簡単にいくつもの軸を一つ
の側に描かせることができます.
\vspace{1em}

1つの側に複数の軸を描こうとする時, そのためにいちいちウインドウを設定
し直す必要はありません. この例では, $y$座標のウインドウとしてセ氏温度
で0度から100度の範囲で設定したのですが, 換算の便のためにケルビンやカ氏
の目盛りもあわせて描いています. ウインドウ設定に影響を与えず, 目盛りだ
けを変えて複数の座標軸を描きたいときは, オフセット機能を用います. その
ためにまず {\tt UZLSET} ルーチンで内部変数 {\tt 'LOFFSET'} を {\tt
.TRUE.} にしておきます. そして, 必要なところで, {\tt UZRSET} ルーチン
で内部変数 {\tt 'YOFFSET'} と {\tt 'YFACT'} ($x$軸については {\tt
'XOFFSET'} と {\tt 'XFACT'})を設定すると, 目盛の位置が {\tt 'YOFFSET'}
だけ平行移動し, 目盛の間隔が {\tt 'YFACT'} 倍されます.

\Dproginput{uxyz2/uxyz8.f}

\begin{center}
\Depsf[10cm]{uxyz2/uxyz8_0001.eps}\\
{\bf uxyz8.f: frame1}\\
\end{center}
