8.2 格子点が不等間隔の場合

Contour, Tone等のモジュールでは格子点が不等間隔の場合、各drawメソッド の引数として格子点の座標値を指定することにより、不等間隔な格子点でもコンタリン グが可能です(U2D3).

#
# u2d3.rb

require "narray"
require "numru/advanceddcl"
include NumRu::AdvancedDCL
include NMath


nx = 37
ny = 37
my = 7
xmin = 0
xmax = 360
ymin = -90
ymax = 90
drad = PI / 180
p = NArray.sfloat(nx, ny)
uy1 = NArray.sfloat(ny)
uy2 = NArray.sfloat(my)
x = NArray.sfloat(nx).indgen * 10

ch = ['SP ', '60S', '30S', 'EQ ', '30N', '60N', 'NP ']

#-- data ---
for j in 0..ny-1
  for i in 0..nx-1
    alon = (xmin + (xmax-xmin)*i/(nx-1)) * drad
    alat = (ymin + (ymax-ymin)*j/(ny-1)) * drad
    slat = sin(alat)
    uy1[j] = slat
    p[i,j] = 3*sqrt(1-slat**2)*slat*cos(alon) - 0.5*(3*slat**2-1)
  end
end

for j in 0..my-1
  uy2[j] = sin((ymin + (ymax-ymin)*j/(my-1)) * drad )
end

#-- graph ---
Dev.open

Frame.new

Fig.window=[xmin, xmax, -1.0, 1.0]
Fig.viewport=[0.2, 0.8, 0.2, 0.8]
Fig.transnum = 1

Axis::Lin.xaxdv('B', 10.0, 60.0)
Axis::Lin.xaxdv('T', 10.0, 60.0)
Axis::Lin.xsttl('B', 'LONGITUDE', 0.0)

Axis::Lin.yaxdv('L', 0.1, 0.5)
Axis::Lin.ysttl('L', 'SINE LATITUDE', 0.0)

Axis::Lin.labelyr = true
Axis::Lin.yaxlb('R', uy1, uy2, ch, 3)
Axis::Lin.ysttl('R', 'LATITUDE', 0.0)

Contour.draw(p, x, uy1)

Dev.close

PROGRAM U2D3

この例では, これまでと同じ2次元配列データですが, y方向にはサイン緯度 (-1から1の値を取る)の座標系を設定してコンタリングをおこないます. ま ず, 配列 UY1 に格子点の座標をU-座標系の値で用意します. UY2 は, Axis::Lin.yaxlb メソッドでy座標軸のラベルを描くために, その座標値を 用意する配列です. 37行めではAxis::Lin.yaxdv ルーチンでサイン緯度の座標軸 を等間隔に刻んで描きます. 次に, 右側のy座標軸にラベルが描けるように して, Axis::Lin.yaxlb ルーチンでデータのある格子点に目盛をつけ, 緯度30度 毎にラベルをつけます.

Contour.draw ルーチンを呼ぶと, 格子点が不等間隔の場合でも御覧 のように等高線図が描かれます.

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