時間座標である「月」を横軸に、 物理量である気温・降水量をそれぞれ縦軸にとったグラフをつくる。 GMT ([別ページ参照])を使う。 GMTを使う実習教材に共通の注意は [別ページ]を見てほしい。 なお、コンピュータ教室以外で図形表示をするには、 X Windowの機能を設定する必要がある [別ページ参照])。 また、コンピュータ教室でコマンドを入力できる画面(「端末」という)を開く方法は [別ページ参照]。
紙に出力するならば、紙面を有効に使うことも考えるべきだが、
その配慮を含めるとプログラムが複雑になるので、
まず、1ページを使って1地点の1変数を表示するプログラム例を示す。
次に、同じページの中に、それぞれ1地点についてのグラフを複数ならべる例を示す(2005-10-24追加)。
例文プログラム(シェルスクリプトおよびその中で使われるファイル)は
/pub/sfc/earthobs/example/normclim/graph1/
のディレクトリに置く。
なお、データは、気象庁編集の気候値データ[別ページ参照]から、
その説明のページの中で紹介した抽出用プログラム
selwmost.awk
で1地点の値を取り出した結果のファイルが、
作業するディレクトリに置かれていることを前提として説明する。
データを別のディレクトリに置いたほうがよいこともある。
その場合は、例文中の
set datapath = .
を書きかえて使えばよい。
たとえば、作業するディレクトリの横ならび(同じ親ディレクトリの下)の
data
というディレクトリにデータを置くとすれば、
set datapath = ../data
のようにする。
実行手順は次のようになる。 (「%」はプロンプト文字の例で、キーボードから入力する文字ではない。)
% mkdir ex1
% cd ex1
% cp /pub/sfc/earthobs/data/jma/norm2002/work1/selwmost.awk .
% cp /pub/sfc/earthobs/data/jma/norm2002/work1/selwmost.sh .
% sh selwmost.sh 48940
t1a.csh
を使うならば、% cp /pub/sfc/earthobs/example/normclim/graph1/t1a.csh .
emacs
を使ってt1a.csh
を
編集するならば、% emacs t1a.csh
emacs
の中で作業し、結果を保存する。t1a.csh
を使って地点48940のデータを作図するとすれば、% csh t1a.csh 48940
t1a_48940.ps
をggv
で見るとすれば、% ggv t1a_48940.ps
ggv
などはバックグラウンドにまわすのが便利である
[別ページ(古い教材)参照]。地点の選択は、地点一覧表ファイル
/pub/sfc/earthobs/data/jma/norm2002/work1/edlist.txt
(日本の地点についてはedlistjp.txt
)を見て自分で決めてほしい。
ただし、気温と降水量の両方がそろった地点
(一覧表ファイルに「T」と「P」(「P_」、「P*」のこともある)の両方がある地点)に限る。
テキストファイルの内容を見るにはless
コマンドを使うとよい。less ファイル名
の形で起動。less
の中では、スペースキーで前進、b
で後退、q
でless
を終了。/
(スラッシュ)に続けて文字列を書くことにより文字列検索ができる。
とくにことわらない限り、
今回の例文では、地点の属性はWMO地点番号(5けたの数字)だけを表示している。
実用的には、地名、緯度、経度、標高などの情報もいっしょに表示できたほうがよい。
その例文はt1f.csh
、p1f.csh
などである。
横軸に月、縦軸に気温をとり、1地点の12か月の気温をそれぞれ点のような記号
(実際には円、psxy
コマンドでオプション-Sc
を使って指定、cはcircle)で表示する。
実行方法は、あらかじめその地点のデータファイル(たとえば48540.txt
とする)を用意しておいたうえで、
csh t1a.csh 48540
のようにする。
実行するとt1a_48540.ps
ができるので、
それをgs
、ggv
、ghostview
などで見てほしい。
この手順は、このページで説明する他の例文についても同じで、変更点は、
シェルスクリプトのファイル名が変わるのと、
複数地点の図を表示する場合には地点番号を複数ならべる必要があるだけである。
この中ではGMTの実質的コマンドはpsxy
を1回使っているだけである。
その前にGMTのオプションを設定するためのコマンドgmtset
も使っている。
psxy
は標準出力にPostScript形式のデータを書き出すので、
Unixの出力redirection機能(「>」)を使って、出力先が.ps
で終わる名前のファイルになるように指定している。
縦軸の範囲は、-50から50までとした。 GMTではとくに指定しなければクリップ(clip)機能が有効なので、この範囲からはみだす数値に対応する図形は表示されない。 気候値の月平均気温が50℃より高い地点はないと思う (低緯度の乾燥地帯では昼の気温はもっと高くなるが、夜には気温は下がる)。 気候値の月平均気温が-50℃より低い地点は南極大陸に存在する。 その地点の気温を正しく表示したい場合は、縦軸の範囲を変える必要がある。
紙面上の図の大きさは、グラフの枠の横が12 cm、縦が20 cmとしてある。
温度の記号「度」は、ここでは便宜上小文字の「o」を上つき添え字にすることによって(@+o@+
という形で)表現している。
なお、シェルスクリプトで、行の最後の「\」(バックスラッシュ、 端末によっては円(日本の通貨)記号で表示されるかもしれない)になっているのは 継続行の印で、 その次にくる行が論理的には同じ行の続きであることを示す。 長い行を書いてもよいのだが、画面上で見にくくなるのでこの方法で適当に分割する。 なお、「\」のあとに何か文字があると継続行の意味にならない。 編集の際には空白文字を残さない(また、空白行を入れない)ように注意する必要がある。
前のt1a.csh
では目盛りつきの枠や表題もかいているが、
それはpsxy
コマンドの-B
オプションを利用している。
このオプションを省略し
狭い意味のpsxy
コマンドの機能だけにすると
どのような図になるかを示す例文である。
t1a.csh
の記号(円)による表示を、
折れ線による表示に変えたものである。
t1b.csh
との違いは、
中で呼ばれているpsxy
の
オプション-Sc
をはずし、
線の太さを指定するオプション-W3
を追加しただけである。
psxy
は、-S
で始まるオプションをつけない場合は、
折れ線をかく。
t1a.csh
の記号(円)による表示と、
t1c.csh
の折れ線による表示を同じ枠の中に重ねた。
このためにはpsxy
を同じデータを使って2回呼ぶ必要がある。
[注意]
GMTのプログラムを複数回使って図をつくるためには、出力のredirectionの
「>
」と「>>
」を使いわけることと、
GMTの各プログラムの
-K
(keep)と
-O
(overlay)というオプションを使う必要がある
[別ページ参照]。
[理屈の部]でも述べたように、
折れ線を横軸の1から12までの間にひいたのでは、
12月から1月にかけての期間が代表されない。
そこで、0の位置に12月の値を、13の位置に1月の値をくりかえして、
14個の点によって13区間からなる折れ線をひき、
自動clip機能を使って表示は横軸の0.5から12.5までの範囲だけにする。
14個の点の値を作るには、Awkプログラムcyclic.awk
を使っている。
その標準出力がpsxy
の標準入力になるように、
Unixのパイプライン機能(「|」)を使っている。
(psxy
の入力はファイル名で指定しても標準入力を使っても
どちらでもよい。)
[注意] cyclic.awk
は
ユーザーの作業ディレクトリに置いて使うようにしてあるので、
% cp /pub/sfc/earthobs/example/normclim/graph1/cyclic.awk .
でコピーしてから
t1e.csh
を実行してほしい。
ほかの例文でも同様にAwkプログラムを用意しておく必要があるものがある。
ただし、このページで紹介するものの範囲で、
同じプログラム名のものは同じ内容なので、
一度コピーすればくりかえす必要はない。
このようにコピーして使うように設定したAwkプログラムは、
どんな操作をしているか、できれば理解してほしいと思ったものなので、
興味のある人はその中身も見てほしい。
t1e.csh
と同じ形のグラフを2つ横にならべて表示する。
2つのグラフの座標のとりかた(-J
、-R
)は同じであり、
原点移動(-X
、あとのt6e.csh
では-Y
も)によってグラフの位置をずらしている。
変数名と単位は縦軸の見出しにし、図の上の表題は地点番号だけにした。
起動はたとえばcsh t2e.csh 48940 47662
のようにWMO地点番号を2つ
空白でくぎってならべる。
できるPostScriptファイル名は、あまり長くしすぎないために、
含める地点番号をひとつだけにした
(上の例ならばt2e_48940.ps
となる)ので注意してほしい。
t1e.csh
と同じ形のグラフを3つ横にならべて表示する。
起動はたとえばcsh t3e.csh
のあとにWMO地点番号を3つ
空白でくぎってならべる。
横幅の節約のため、縦軸の目盛りをつけるのを左端の図だけにした。
また、変数名と単位は、psxy
の-B
オプションによるのではなく、別にpstext
を呼んで書くようにした。
2つめの図をかいたついでに、pstext
の-N
オプションを使ってclip機能を解除し、図のわくの外に文字をかいている。
なお、pstext
を呼ぶ際に使われている「<<
」は
redirectionの一種のhere documentというシェルの機能で、
それが使われているコマンドのあと、
「<<
」に続いて示されている文字列
(なんでもよいが今の場合はend of dataのつもりで「EOD
」にした)が
また出てくるまでの行を、コマンドではなく標準入力データとみなして読む。
シェルスクリプト中でコマンドに標準入力から読ませたいデータがあり、
別のファイルにするよりもシェルスクリプト自体の中に書いておきたいときに
よく使われる。
t1e.csh
と同じ形のグラフを6つ(横に3つ、縦に2つ)ならべて表示する。
基本的にt3e.csh
と同様である。
よく似た作業をデータだけを変えてくりかえす作業であるが、 今のところ、シェルスクリプトの形式も、 よく似た文がくりかえし書かれたくどい形になっている。 同じ文をくりかえし使う形にしてシェルスクリプトを短くしたほうが、 保守しやすいという意味ですぐれているのだが、 一連のGMTコマンドのうち最初に呼ばれるものと最後に呼ばれるものに 特別な扱いが必要であることの兼ね合いで、くふうが必要となる。 できれば次の機会にはそのようなくふうをした例文も紹介したい。
それぞれt1e.csh
など、f
をe
に
変えた名前のものと図、実行方法とも同じだが、
地点の情報(WMO番号、地点名、緯度、経度、標高)の文字による表示を追加した。
地点一覧表ファイルedlist.txt
とedlistjp.txt
から
指定した地点の情報を抜き出し、GMTのpsxy
の入力の形に変換する
仕事は、プログラムsttext.awk
で行なっている。
なお、その中で地点の情報に次のような編集を加えている。
-999
となっているが、
図には何も表示しないことにする。実行方法もそれぞれ対応するt1e.csh
などと同様だが、
シェルスクリプトのほかにsttext.awk
を
例文プログラムのディレクトリから作業ディレクトリにコピーしてから実行する。
なお、前の例文ではpsxy
の-B
の中で 指定した表題の一部としてWMO番号を表示していたが、それは不要になったので、 その関係のシェルスクリプト上の変更が少しある。
t1a.csh
と同様に、
横軸に月、縦軸に降水量をとり、1地点の12か月の降水量を記号(円)で表示する。
縦軸の範囲は0から500までとした。
月降水量が500 mmを越えることはありうるが珍しいので、
そのような場合は例外として対処すればよいと考えたからである。
psxy
は入力ファイルの第1列を横軸、第2列を縦軸にとるので、
Awkを使って入力データの第1列(月)と第3列(降水量)を
psxy
の標準入力に与える。
降水量を棒グラフで表現してみた。
psxy
のオプション-Sb
を使う。
ただし棒は枠のみ(白抜き)である。
棒の幅は、この例では隣り合う棒が接するように1.0を与えた。
値を少なめにして棒が接しないようにすることもできる。
これも棒グラフだが、色(青)による塗りつぶしにしてみた。
-Sb
はそのままで、塗りつぶしの指定-G
を追加した。
-G
のあとの0/0/255
は、
RGB(赤、緑、青)それぞれ下限0、上限255で色を指定している。
p1c.csh
の塗りつぶしの棒に、
p1b.csh
の棒の枠を重ねた。
この場合、psxy
は1回で、
-G
(塗りつぶし)と
-W
(線、その太さの指定もする)のオプションを両方使えばよい。
p1d.csh
と同じ形の図を、
t2e.csh
, t3e.csh
, t6e.csh
と同様に、
それぞれ2つ、3つ、6つ、同じページに表示する。
それぞれp1d.csh
など、f
をd
に
変えた名前のものと図、実行方法とも同じだが、
地点の情報(WMO番号、地点名、緯度、経度、高さ)の文字による表示を追加した。
t1f.csh
などと共通のsttext.awk
を利用している。
降水量を横軸、気温を縦軸にとることにする。
横軸に降水量、縦軸に気温をとり、1地点の12か月の値の組を記号(円)で表示する。
両軸それぞれの範囲はp1a.csh
、t1a.csh
と同様にした。
紙面の大きさを縦横とも15 cmとした。
pt1a
の記号表示に、折れ線を重ねた。
12角形が閉じるように、
Awkプログラムcyclicpt.awk
を使って13個の位置
(1月の値の組をくりかえす)を与えた。
どの記号がどの月であるかわかるようにする方法も考えるべきだが、 まだできていない。