GMTで描こう Part 4: gmtconvert
gmtconvert
モジュール
GMT6のモジュールgmtconvert
を解説します(コマンドラインで指定するモジュール名はconvert
ですが、最新版のDocumentationにならってgmtconvert
と表記します)。このモジュールには以下の機能があります。
convertはその標準入力(または入力ファイル)を読み込み、標準出力に要求された情報を書き出す。9つの処理の組み合わせを実行できる。
1. バイナリとASCIIデータテーブルを相互に変換する。
gmtconvert — GMT 6.2.0rc1 documentation(抄訳)
2. 複数のファイルから対応するレコードを水平方向に1つのファイルに貼り付ける。
3. 利用可能な列の一部を抽出する。
4. ヘッダーレコードがテキストパターン検索に一致するセグメントのみを抽出する。
5. セグメントヘッダーのみをリスト化し、データレコードはリスト化しない。
6. 各セグメントの最初 and/or 最後のデータレコードを抽出する。
7. 出力のアイテムの順序を逆にする。
8. セグメント番号の範囲のみを出力する。
9. レコード数が基準に一致するセグメントのみを出力する。
本稿では一部の機能、特に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関数の描画の記事でチャレンジしたいと思います。