[ GFD Dennou Ruby Home | GPhys Home | Tutorial top ]

GPhys, GGraphチュートリアル (その6)

可視化の第三歩

今度はプログラムを使って図を描きます. プログラムを取っておくことで同じ図が何度でも描けるようになります. また,少し複雑なことをするには最初からプログラムを作ると良いでしょう.

目次

描画プログラムの作成法

irb への入力を利用する場合

可視化の第二歩 の「いろんな断面」の最初の作図をプログラムとして電子ファイルにしてみましょう. irb で行った,

tmp = gpopen 'air.2012-01.nc/air'
set_fig "itr"=>32          # 正距方位図法
set_map "coast_world"=>true
tone_and_contour tmp[true,true,3,9]

という入力を再現するには,それらが入ったテキストファイルを作ります. ここではファイル名を sample_tone_1.rb とします (Rubyプログラムは .rb で終わるようにします). その際少し追加が必要です. スタートアップファイル irbrc_ggraph.rb は冒頭で陽に require しましょう *1. また,描画終了処理のため,DCL.grcls を呼びます:

実行:

$ ruby sample_tone_1.rb

結果: img/ggraph_step_01_s.png(クリックでフルサイズ表示)

簡単なプログラムを一から書く

上記のように irb 用スタートアップファイルを用いず, GGraph の機能だけを使って同じ図を描いてみましょう. プログラムの中身は次のようにしました.

前の例からの変更のポイントは次です.

実践例 (コマンドラインオプションの使用/レイアウト/お手軽アニメ)

プログラムなら複雑な描画も実現できます (最初は簡単な描画を実装し,実行して調整するというのを繰り返して,徐々に充実させていくとよいでしょう). また,入力パラメタを設けることで用途を広げることもできます.

以下のプログラムは,2012年の北半球の総観場をアニメで表示します. ソース冒頭にコメントとして書いてあるように, コマンドライン引数としてオプションが指定できます. つまり,

$  ruby sample_synop.rb

とオプション無しで実行することも,

$  ruby sample_synop.rb 2 0 21 30

などと,オプションをつけて実行することもできます.

結果の一枚: img/sample_synop_fig_s.png(クリックでフルサイズ表示)

このプログラムは,2012年1月の日々の気温(色)・等圧面高度(コンター)の 水平断面(850hPa)と鉛直断面(45N)をアニメで表示します (鉛直断面は経度平均からの偏差.オプションで期間や描画間隔等が指定できます). 見どころは,移動性高低気圧発達時(左図でみる)に 高度の偏差の鉛直断面(右図)が西に傾くかや, (地衡流からわかる)南風/北風に対応して高温/低温偏差になるか,などです.

プログラムについて,本チュートリアルでこれまで出てこなかったところを解説します.

Ruby ではコマンドライン引数は,ARGV という組み込みの配列に文字列として入ります(スペースで区切って順番に). iws = ( ARGV[0] || 1 ).to_i では最初の要素 ARGV[0] があればそれを,なければ 1 を,整数化して変数 iws に格納します *3

コマンドライン引数を使わず, (初歩的な計算機演習でよくあるように) プログラムを実行するとパラメタ入力を求めるようにもできますが, 引数にするほうが繰り返しの実行が楽に出来ます. なお,本格的なコマンドラインオプションをサポートするには, Ruby の組み込みライブラリ optparse を使うとよいでしょう(optparse は ARGV をコマンドラインオプションとして解釈するためのライブラリです).

DCLの設定では,DCL.sldiv("y",2,1) で画面分割します (第一引数は "y" なら横→縦並び,"t"なら,縦→横並び). 横幅の広い画面を確保するため,DCL.swpset で画面の縦横のピクセル数を指定します(出力先がPostScriptの 場合もここで指定した縦横サイズの比が確保されます).

GPhys の cut メソッドでは,座標軸が時刻の場合 (単位が "days since 2001-01-01" などとなっていてカレンダーと対応がつく場合), 直接の座標値のほか,Date または DateTime でも指定できます(time = Date.new(2012,1,d), tmp.cut("level"=>850,"time"=>time)のところ). GPhys の eddy メソッド (GGraph.tone tmp.cut("lat"=>45,"time"=>time,"level"=>1000..100).eddy(0) のところ)では,平均からのずれ(偏差)を計算します.eddy(0) で,第1次元(ここでは経度)に沿った平均(いわゆる帯状平均)からのずれになります.

GGraph.set_axes では "xmaplabel" 等により, 経度にふさわしい座標軸を描きます.(その他のGGraphメソッドは既出. GGraphのマニュアル (日本語訳) も参照してください.)

演習問題

  1. 上記の sample_synop.rb をもとに,次のようなプログラムを作りましょう.

[次へ進む]


*1冒頭に require 行を入れない場合, ruby -r ~/irbrc_ggraph.rb sample_tone_1.rb と実行します.
*2 メソッドにせず,そのままベタに書いてもいいのですが, まとまりがわかりやすいようそうしました (読者が使いまわすことを念頭に,このプログラムには不必要なものも含まれてます). irbrc_ggraph.rb の中をみて,他にも好きなように取り入れるといいでしょう. 自分用のオリジナルな prep_dcl を独立したファイルにして require するのも良いです.
*3 || は "or" をとる演算子で,その左側を実行したら偽 (false か nil) の場合,右側を実行してその結果を返します. 1はもともと整数なので整数化する必要はありませんが,|| を活かすための方策です.


davis Group / GFD Dennou Staff dcstaff@gfd-dennou.org