8.1 注文の多い目盛りうち

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

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

      PROGRAM UXYZ5

      PARAMETER( NX1=21, NX2= 5 )
      PARAMETER( NY1= 0, NY2=18 )
      REAL      RX1(NX1), RX2(NX2), RY2(NY2)
      CHARACTER CX2(NX2)*4, CY2(NY2)*4

      DATA      RX1/-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,
     +                5, 10, 15, 20, 25, 30, 35, 40, 45, 50/
      DATA      RX2/  -40 ,  -20 ,    0 ,   20 ,   40 /
      DATA      CX2/'40S ','20S ','EQ  ','20N ','40N '/
      DATA      RY2/ 1000 , 850  , 700  , 500  , 400  , 300  ,
     +               250  , 200  , 150  , 100  , 70   , 50   ,
     +               30   , 10   , 5    , 2    , 1    , 0.4  /
      DATA      CY2/'1000','    ','    ','500 ','    ','    ',
     +              '    ','200 ','    ','100 ','    ','50  ',
     +              '30  ','10  ','5   ','2   ','1   ','.4  '/

      WRITE(*,*) ' WORKSTATION ID (I) ? ;'
      CALL SGPWSN
      READ (*,*) IWS

      CALL GROPN( IWS )
      CALL GRFRM

      CALL GRSWND( -50., 50., 1.E3, 0.4 )
      CALL GRSVPT(  0.2, 0.8,  0.2, 0.8 )
      CALL GRSTRN( 2 )
      CALL GRSTRF

      CALL UXAXLB( 'B', RX1, NX1, RX2, CX2, 4, NX2 )
      CALL UXAXLB( 'T', RX1, NX1, RX2, CX2, 4, NX2 )
      CALL UXSTTL( 'B', 'LATITUDE', 0. )

      CALL UYAXLB( 'L', DUMMY, NY1, RY2, CY2, 4, NY2 )
      CALL UYAXLB( 'R', DUMMY, NY1, RY2, CY2, 4, NY2 )
      CALL UYSTTL( 'L', 'PRESSURE (hPa)', 0. )

      CALL UXMTTL( 'T', 'UXAXLB/UYAXLB', 0. )

      CALL GRCLS

      END
PROGRAM UXYZ5

\resizebox{10cm}{!}{\includegraphics{uxyz2/uxyz5.eps}}
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と指定すれば大丈夫です.