GMTで描こう Part 4: gmtconvert

gmtconvertモジュール

 GMT6のモジュールgmtconvertを解説します(コマンドラインで指定するモジュール名はconvertですが、最新版のDocumentationにならってgmtconvertと表記します)。このモジュールには以下の機能があります。

convertはその標準入力(または入力ファイル)を読み込み、標準出力に要求された情報を書き出す。9つの処理の組み合わせを実行できる。

1. バイナリとASCIIデータテーブルを相互に変換する。
2. 複数のファイルから対応するレコードを水平方向に1つのファイルに貼り付ける。
3. 利用可能な列の一部を抽出する。
4. ヘッダーレコードがテキストパターン検索に一致するセグメントのみを抽出する。
5. セグメントヘッダーのみをリスト化し、データレコードはリスト化しない。
6. 各セグメントの最初 and/or 最後のデータレコードを抽出する。
7. 出力のアイテムの順序を逆にする。
8. セグメント番号の範囲のみを出力する。
9. レコード数が基準に一致するセグメントのみを出力する。

gmtconvert — GMT 6.2.0rc1 documentation(抄訳)

本稿では一部の機能、特に2, 3, 6, 7について解説します。またテキストファイルとして表現されるASCIIデータテーブルのみを対象にし、バイナリデータは扱いません。

入力ファイルの準備

 以下のようなデータテーブルファイル left.txt, mid.txt, right.txt を用意します。すべてヘッダー無しで、2列3行の left.txt, mid.txt, 最後のテキスト列を含め3列3行の right.txt を同じディレクトリに置いておきます。

$ cat left.txt
 1   10
 2   20
 3   30
$ cat mid.txt
 1   28
 2   11
 3   94
$ cat right.txt
 20   200   foo
 40   400   bar
 60   600   baz

gmtconvertの機能

以下では、gmtconvertの使い方について説明していきます。

横方向に列を結合する

 複数の入力ファイルを横方向に結合するには、-Aオプションを使います。このとき入力ファイルの行数は同じでなければなりません。テーブルの結合は、入力ファイルの順に右側に追加される形で行われます。
 結果は標準出力されます。ファイルとして保持したい場合はシェルのリダイレクト(> または >>)を使いましょう。

$ gmt convert left.txt mid.txt -A
 1   10   1   28
 2   20   2   11   
 3   30   3   94

 このオプションでは、一番右のファイルの最後列にテキスト列がある場合には、その列は出力されません。

$ gmt convert left.txt right.txt -A
 1   10   20
 2   20   40
 3   30   60

必要な列のみ抽出する

 このモジュールでは指定した列のみを抽出して出力することができます。列の指定には-oオプションを使います。-o0,1,3のようにオプションフラッグの後ろに列番号を指定します。列番号は0から始まり、左のテーブルから右のテーブルへと通し番号が振られます。カンマで区切るほかに、-o0,2-4のようにハイフンで範囲を指定する方法が利用できます。

$ gmt convert left.txt mid.txt -A -o0,1,3
 1   10   28
 2   20   11
 3   30   94

 -oオプションは一つのファイルに対しても適用可能です。right.txtの最も右のテキスト列のみを抽出したい場合は、以下を実行します(列番号1を指定した場合は、非数と出力されてしまいます)。

$ gmt convert right.txt -ot
foo
bar
baz
$ gmt convert right.txt -o1
NaN
NaN
NaN

なお複数のファイルを入力とする(つまり-Aオプションを併用する)場合は、-oオプションにtを指定してもテキスト列は表示されません。

最初と最後の行のみ出力する

 -Eオプションを使うとテーブルの最初と最後の行のみ出力することができます。このオプションは、デフォルトでは、最初と最後の行を両方を出力しますが、fまたはlを追加するとそれぞれ最初または最後のみを一つだけ出力します。

$ gmt convert left.txt -E
1   10
3   20
$ gmt convert left.txt -Ef
1   10
$ gmt convert left.txt -El
3   30

行の順序を逆にする

 -Iオプションでテーブルの行の順序を逆にして出力できます。

$ gmt convert left.txt -I
3   30
2   20
1   10

列を指定してソートする

 -Nオプションでは、列番号を指定して、その列の値に基づいて数値的にソートすることができます。データテーブルは、選択した列が昇順になるように並べ替えられます(明示的に昇順にするには+aを追加します)。

$ gmt convert mid.txt -N1
 2   11
 1   28
 3   94

+dを追加することで、降順にすることができます。

$ gmt convert mid.txt -N1+d
 3	  94
 1	  28
 2	  11

出力する行の範囲を指定する

 -Zオプションに行番号の範囲を指定することで、出力する行を絞ることができます。-Z[first][:last]のように、firstに初めの位置の行番号を、lastに最後の位置の行番号を指定します。firstまたはlastのどちらかを省略した場合は、それぞれ先頭の行(行番号0)または最後尾の行がデフォルトであり、その範囲について出力されます。

$ gmt math -T0/360/2 T SIND = | gmt convert -Z40:50
80	0.984807753012
82	0.990268068742
84	0.994521895368
86	0.99756405026
88	0.999390827019
90	1
92	0.999390827019
94	0.99756405026
96	0.994521895368
98	0.990268068742
100	0.984807753012

使用例

以下のように媒介変数表示された関数をプロットします。

$$x = 16 \sin ^3 t \\ y = 13 \cos t – 5 \cos 2t -2 \cos 3t -\cos 4t \\ (0 \leq t \leq 2\pi) $$

スクリプトは次のようになります。

#!/bin/bash
gmt begin heart png
   gmt basemap -JX10c -R-18/18/-18/18 -BWESN -Bag
   gmt math -T0/6.28/0.01 T SIN 3 POW 16 MUL = x.dat
   gmt math -T0/6.28/0.01 13 T COS MUL  -5 2 T MUL COS MUL ADD \
      -2 3 T MUL COS MUL ADD  -1 4 T MUL COS MUL ADD = y.dat
   gmt convert x.dat y.dat -A -o1,3 | gmt plot -Glightred
gmt end 

4-6行目でgmtmathモジュールを使って、tの関数x, yの値を求めています。7行目ではgmtconvertモジュールが x, yの値の列を取り出して2列のテーブルを作り、パイプラインを使ってplotモジュールに渡しています。

きれいなハートマークを描くことができました。

まとめ

 今回はgmtconvertモジュールの、

  • データテーブルを横に結合できる
  • 必要な列のみ抽出できる
  • 列を指定してソートできる
  • 行の範囲を指定してテーブルのサブセットを出力できる

という機能について解説しました。ここでは媒介変数表示された関数のプロットに使用しましたが、4番目の機能を使えば関数の描画をアニメーションで出力することもできます。それは次回、movieモジュールを使ったsin関数の描画の記事でチャレンジしたいと思います。

参考文献

  1. gmtconvert — GMT 6.2.0rc1 documentation
  2. convert — GMT 6.0.0_r20460 documentation

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次の記事

GMTで描こう Part 5: movie