次のプログラム step1 では, uulin メソッド(元サブルーチン)を用いて4種類
の折れ線を一枚の図に重ね書きしてみましょう. まず, usspntルーチン
を4回呼んで x と y0, y1, y2, y3 のデータ
のなかから x と y の最大値と最小値を見つけ, 「おまかせ」で正規化変
換を確定して, 座標軸も描きます.
さて, 折れ線の描画ですが, 折れ線には, 線種と線の太さの2つの属性があり
ます. uuslnt と uuslni のメソッド(元サブルーチン)でこれらの属性を変更
でき, uulin ルーチンで折れ線を描きます. 属性を陽に変更しなければ,
それぞれの初期値(デフォルト)がそのまま使われます.
このプログラム例では, まず初期値のまま (X,Y0) の折れ線を描き, 次 に少し線を太くして, 破線で (X,Y1) を, 点線で (X,Y2) を, そ して1点鎖線で (X,Y3) を描いています.
n (整数型) データ数. x, y (実数型) 折れ線を結ぶ点の(x,y)座標値 を与える配列.
itype (整数型) 折れ線の線種. 1:実線, 2:破線, 3:点線, 4:1点鎖線. (初期値は1)
index (整数型) 折れ線の太さ. 1から大きくなるにつれて太くなる. (初期値は1)
これらは, 個々のルーチンで属性を決めてから uulin で折れ線を描く, 「根回し型」のルーチン群です. これに対して, ひとつのメソッド(元サブルーチン)で属性 も同時に指定して折れ線を描く, 「上意下達型」のルーチン uulinz も 用意されています. 好みの方を使って下さい.
step1.rb: frame1
# step1.rb require "narray" require "numru/dcl" include NumRu include NMath nmax = 201 imax = 5 len_2 = 5 ix = 0 iy0 = 1 iy1 = 2 iy2 = 3 iy3 = 4 z1 = NArray.sfloat(nmax, len_2) a = [] #-- data ---- for m in 1..imax tm = (2*m - 1)*PI a[m-1] = (-1.0)**m * 2/tm end idx = NArray.sfloat(nmax).indgen! z1[true,ix] = 1.0*idx/(nmax-1) tn = 2*PI*z1[true,ix] z1[ ( (tn>=(PI/2)) & (tn<(PI*3/2)) ).where, iy0] = 1.0 z1[true,iy1] = 0.5 + a[0]*cos(tn) z1[true,iy2] = 0.5 z1[true,iy3] = 0.5 for k in 1..imax tk = 2*k - 1 tc = a[k-1]*cos(tk*tn) z1[true,iy2] = z1[true,iy2] + if (k <= 3) then tc else 0 end z1[true,iy3] = z1[true,iy3] + tc end #-- graph ---- iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i DCL::gropn iws DCL::grfrm x = z1[true,ix] y0 = z1[true,iy0] y1 = z1[true,iy1] y2 = z1[true,iy2] y3 = z1[true,iy3] DCL::usspnt(x, y0) DCL::usspnt(x, y1) DCL::usspnt(x, y2) DCL::usspnt(x, y3) DCL::uspfit DCL::grstrf DCL::ussttl('FREQUENCY', '/DAY', 'RESPONSE', '') DCL::usdaxs DCL::uulin(x, y0) DCL::uuslnt(2) DCL::uuslni(3) DCL::uulin(x, y1) DCL::uuslnt(3) DCL::uulin(x, y2) DCL::uuslnt(4) DCL::uulin(x, y3) DCL::grclsprogram step1