6.1 等高線図

格子点で与えられた2次元のスカラーデータを手早く等高線図で描きたいとい うときには, メソッド Contour.draw を呼びます(U2D1). Contour.draw ルーチンは等高線を描くだけですから, まず正規化変換を設定します. ウインドウは Figモジュールのパラメタ window で[TMIN,TMAX]×[ZMIN,ZMAX]( [0,5]×[20,50])と陽に設定 しますが, ビューポート([0.2,0.8,] ×[0.2,0.8,] )と変換関数番号(1: 直角一様座標)は括弧内の初期値を用います.

次に, Axis.title メソッドで座標軸タイトルの情報を与え, Axis.draw ルーチンでおまかせの座標軸を描きます.

そして, 最後に Contour.draw メソッドを呼んで等高線を描きます. 現在設定 されているウインドウいっぱいに等間隔の格子点が設定されて,コンタリング が行なわれます. つまり, 座標軸の目盛に関係なく, U(1,1) が左下隅, U(NT,NZ) が右上隅にくるように等間隔の格子点座標が設定されます. コンターレベルは自動的に決定され, 図の下にそのコンター間隔が表示されま す. Contour.draw の引数の2番目以降で配列の寸法を指定しますが, 第1次元 寸法を2度指定するのは, 配列の一部分だけを作画できるようにするためです. この例のようにデータ全部を描く場合は, 2番目の引数と3番目の引数を同じ (NT)にします.

#
# u2d1.rb


require "narray"
require "numru/advanceddcl"

include NumRu::AdvancedDCL
include NMath

nt = 51
nz = 21
tmin = 0.0
tmax = 5.0
zmin = 20.0
zmax = 50.0
dt = (tmax-tmin)/(nt-1)
dz = (zmax-zmin)/(nz-1)

u = NArray.sfloat(nt, nz)

#-- data ----
for j in 0..nz-1
  zj = j*dz
  uz = exp(-0.2*zj)*(zj**0.5)
  for i in 0..nt-1
    ti = i*dt-2.0*exp(-0.1*zj)
    u[i,j] = uz*sin(3.0*ti)
  end
end

#-- graph ----
Dev.open
Frame.new

Fig.window=[tmin, tmax, zmin, zmax]

Axis.title('TIME', 'YEAR', 'HEIGHT', 'km')
Axis.draw

Contour.draw(u)

Dev.close

 
PROGRAM U2D1

\resizebox{10cm}{!}{\includegraphics{u2d/u2d1.eps}}
u2d1.rb: frame1