GMT-5 座標軸と-Bオプション

Table of Contents

GMTで最も複雑なオプションが[cci_bash]-B[/cci_bash]です.が,以下のように整理すると基本はそれほど難しくありません.最初は基本的な機能だけ扱います.

-BはFrame parametersとAxes parametersから構成

[cci_bash]-B[/cci_bash]オプションはFrame parametersとAxes parametersから構成され,
[cc lang="bash"]
-BFrame_parameters -BAxes_parameters
[/cc]
のように,それぞれ分けて記述することができます.Frame_parametersとAxes_parametersの内部ではスペースを入れてはいけません.まず,Frame parametersから見ていきます.

Frame parameters

Frame parametersではどの軸を描くか設定します.矩形図の西,東,南,北に相当する,[cci_bash]W[/cci_bash],[cci_bash]E[/cci_bash],[cci_bash]S[/cci_bash],[cci_bash]N[/cci_bash]を用い,大文字([cci_bash]WESN[/cci_bash])なら軸目盛りとラベルを描き,小文字([cci_bash]wesn[/cci_bash])なら軸目盛りだけを描きます.また,いずれも付けなければ,軸そのものを描きません.3次元でz軸がある場合は,同様に[cci_bash]Z[/cci_bash]または[cci_bash]z[/cci_bash]を付けることができます.さらに,[cci_bash]+g[/cci_bash]を追記して塗りつぶしを指定でき,[cci_bash]+t[/cci_bash]を追記してタイトルを書けます.以下に例を示します.
[cc lang="bash"]
-BWeSn ### 左と下にラベル付きの軸目盛りを描き,左と上は軸目盛りだけ描きます
-BWS ### 左と下のみラベル付きの軸目盛りを描きます
-BWS+glightred+t"Title" ### +gで色を塗り,+tでタイトルを書きます
-BWeSnZ ### 3次元の場合で,鉛直軸にもラベル付き軸目盛りを描きます
[/cc]

Axes parameters

それぞれの軸の目盛り間隔等を設定します.x,y,zの各軸別に
[cc lang="bash"]
-Bx軸の設定 -By軸の設定 -Bz軸の設定
[/cc]
のように分けて設定するのがわかりやすいと思います.よく使うフラグは[cci_bash]afg[/cci_bash]でそれぞれ([cci_bash]a[/cci_bash])nnotation主目盛りの間隔(ラベル付き),([cci_bash]f[/cci_bash])rame副目盛りの間隔(ラベルなし),([cci_bash]g[/cci_bash])rid格子の間隔で,以下のように設定します.
[cc lang="bash"]
-Bxa10f2g1 ### x軸を対象に主目盛り間隔を10,副目盛り間隔を2,格子間隔を1
-Byafg ### y軸を対象にお任せで各目盛りを振る
[/cc]
さらに,追記で,デカルト座標系の場合には(地図では使えません)[cci_bash]+l[/cci_bash]で軸名,[cci_bash]+u[/cci_bash]で単位を付けることができます.文字列にスペースを含まない場合は[cci_bash]" "[/cci_bash]を省略できます.
[cc lang="bash"]
-Bxafg+l"x title"+u" unit" ### "x title"を軸名," unit"を単位として描く
[/cc]
このように,基本は簡単ですが,日付軸や地理座標等の様々な軸を描くのは結構複雑なので,以下に示すようなGMTの公式ドキュメント公式チュートリアルに紹介されている具体例を参考にするのがよいでしょう.

デカルト座標系の簡単な例

ボックスを作り,色を塗り,お任せで座標軸目盛りを設定し,タイトルを付けます.ここで,はまりやすい点の注意です.以下のように変数を定義して用いる場合は
[cc lang="bash"]
Bx=afg+l"x title"
-Bx"${Bx}"
[/cc]
のようにダブルクオーテーションで"変数"を囲んでおく必要があります.実際は[cci_bash]+l[/cci_bash]でスペースを含む文字列を扱う場合にのみエラーとなるようですが,常に付けておきましょう.また,以下の例では[cci_bash]ps=${0%.sh}.ps[/cci_bash]という部分がありますが,これを理解するにはこちらが参考になります.
[cc lang="bash"]
#!/bin/bash
# bash script for GMT 5.2.1 or later
# Tutorial for -B option of GMT-5
# Windows Subsystem for Linux (WSL)対応
# WSLではGMTはWindows版とLinux版の両方が利用できる
# $gmtをgmt.exe (Windows)またはgmt (Linux)と定義し,$gmtを使う
# WindowsのCドライブの参照の方法を定義する
# Windows: c: Linux: /mnt/c
# Windows 10のJupyter Notebook (Python)からsubprocessで実行可能
# Author Jun Sasaki @UTokyo
# Coded on Nov. 25, 2017, Revised on Nov. 25, 2017
# USAGE: $ bash gmt-5-B.sh [windows|linux]
# 最初の引数がwindowsまたはlinuxの場合は特別扱い
##### START ここから
gmt_system=linux # set defalut: =windows or =linux
### check the 1st argument and set Windows' working drive name
if [ "$1" = "windows" ] ; then
gmt_system=windows; shift
elif [ "$1" = "linux" ] ; then
gmt_system=linux; shift
fi
if [ "${gmt_system}" = "windows" ] ; then
dat_dir="c:" # Set dir containing data
gmt="gmt.exe"
echo -n Windows GMT-; $(echo $gmt --version)
else
dat_dir="/mnt/c" # Set dir containing data
gmt="gmt"
echo -n Linux GMT-; $(echo $gmt --version)
fi
ps=${0%.sh}.ps # ファイル名から拡張子.shを削除し,.psを加えた文字列を$psとする.$0はスクリプトファイル名を意味します.
##### END ここまでは共通で,以降の例では省略する
Bf=WeSn+glightred ### Frame parameters
Bx=afg+l"x label"+u"unit" ### Axes parameters
By=afg ### Axes parameters
$gmt psbasemap -R10/70/-3/8 -JX8c/3c -B"${Bf}" -Bx"${Bx}" -By"${By}" -P >$ps
$gmt psconvert $ps -A -Tg -E100
rm $ps
[/cc]

対数軸のボックス

log-logの図を描きます.[cci_bash]-JX[/cci_bash]の最後に[cci_bash]l[/cci_bash]を付けるとlogになります.[cci_bash]-Bya1p[/cci_bash]の[cci_bash]p[/cci_bash]はべき乗(power)表示を意味します.[cci_bash]p[/cci_bash]の前は常に[cci_bash]1[/cci_bash]でよいでしょう.[cci_bash]-By[/cci_bash]の[cci_bash]a[/cci_bash]や[cci_bash]f[/cci_bash]の後の数値の効果はわかりにくいので適当に試してみましょう.例えば,[cci_bash]f[/cci_bash]の後の数値は,[cci_bash]1[/cci_bash]は副目盛りなし,[cci_bash]2[/cci_bash]は2つ副目盛りが入る,[cci_bash]3[/cci_bash]は細かく副目盛りが入り,[cci_bash]4[/cci_bash]以上は[cci_bash]3[/cci_bash]と同じ,といったように決まっているようです.
[cc lang="bash"]
Bf=WS ### Frame parameters
Bx=a2+l"Wavelength (m)" ### Axes parameters
By=a1pf3+l"Power (W)" ### Axes parameters
$gmt psbasemap -R1/10000/1e20/1e25 -JX12cl/8cl -B"${Bf}" -Bx"${Bx}" -By"${By}" -P >$ps
[/cc]

同様ですが,[cci_bash]-Bx[/cci_bash]の[cci_bash]a2[/cci_bash]を[cci_bash]a1[/cci_bash]にすると以下のようになります.

さらに[cci_bash]-Bya1pf3g3+l"Power (W)"[/cci_bash]のように[cci_bash]g3[/cci_bash]を付けると,格子線が描かれます.

地図を描く

次に[cci_bash]pscoast[/cci_bash]を使って地図を描きましょう.地図の場合は[cci_bash]-Bx[/cci_bash]で[cci_bash]-l[/cci_bash]による軸タイトルの描画ができません.[cci_bash]-l[/cci_bash]はデカルト座標系のみで使えます.[cci_bash]gmtset[/cci_bash]はデフォルト値を上書きし,フォントの大きさや枠のタイプ等,様々な設定が可能です.また,デフォルト値の変更は
[cc lang="bash"]$ gmt defaults -D >gmt.conf[/cc]
でカレントディレクトリに[cci_bash]gmt.conf[/cci_bash]をコピーし,これを編集することでも可能です.さらに,
[cc lang="bash"]$ gmt defaults -D >~/gmt.conf[/cc]
でホームディレクトリにコピーするか,[cci_bash]~/.gmt/gmt.conf[/cci_bash]にコピーし,編集すれば,デフォルト値そのものを変更できます.
[cci_bash]-S[/cci_bash]は水域の塗りつぶしで,[cci_bash]-W[/cci_bash]は線の太さをpointで指定します.[cci_bash]-G[/cci_bash]は陸域の塗りつぶしです.[cci_bash]-D[/cci_bash]は解像度で,([cci_bash]f[/cci_bash])ull, ([cci_bash]h[/cci_bash])igh, ([cci_bash]i[/cci_bash])ntermediate, ([cci_bash]l[/cci_bash])ow, ([cci_bash]c[/cci_bash])rude,または([cci_bash]a[/cci_bash])utomaticが選択できます.([cci_bash]a[/cci_bash])では最適なものが選ばれます.[cci_bash]pscoast[/cci_bash]にはたくさんのオプションがあり,河川や国境も描けます.
[cc lang="bash"]
$gmt gmtset MAP_FRAME_TYPE = plain ### fancyにすると縞になる(デフォルト)
$gmt gmtset FORMAT_GEO_MAP = ddd:mm:ssF # F means attaching E/W and N/S
Bf=WeSn ### Frame parameters
Bx=a5f1 ### Axes parameters
By=a5f1 ### Axes parameters
$gmt pscoast -R120/150/20/50 -JM12c -Da -Slightblue -B"${Bf}" -Bx"${Bx}" -By"${By}" -Gchocolate -W0.25p -P >$ps
[/cc]

残念ながら[cci_bash]pscoast[/cci_bash]の海岸線は日本沿岸の狭領域では今ひとつ使えません.東京湾を見るとよくわかりますが,[cci_bash]-Df[/cci_bash]でも精度が非常に悪いです.

時系列デカルト座標系

次に時系列について見ていきます.[cci_bash]-B[/cci_bash]オプションでこれまで使っていなかった,Axes parametersの([cci_bash]p[/cci_bash])rimary軸と([cci_bash]s[/cci_bash])econdary軸を組み合わせることと,[cci_bash]gmtset[/cci_bash]で[cci_bash]FORMAT_DATE_MAP[/cci_bash]を適切に設定するのがポイントになります.ここであらためて[cci_bash]-B[/cci_bash]オプションの全体像を見ておきます.
既述のように,[cci_bash]-B[/cci_bash]オプションはFrame parametersとAxes parametersから構成されます.Frame parametersの全体像は以下のようになります.
[cc lang="bash"]
-B[WwSsEeNn][+b][+gfill][+n][+olon/lat][+ttitle]
[/cc]
[cci_bash]+g[/cci_bash]はキャンバスの塗りつぶしを行い,[cci_bash]+n[/cci_bash]を付けるとフレームを一切描きません.[cci_bash]+O[/cci_bash]は格子線に係わるものですが普通は使わないでしょう.
一方,Axes parametersの全体像はx軸について見ると以下のようになり,([cci_bash]p[/cci_bash])rimary軸と([cci_bash]s[/cci_bash])econdary軸に分けて設定できます.
[cc lang="bash"]
-B[p][x]intervals[+l|Llabel][+pprefix][+uunit]
-B[s][x]intervals[+l|Llabel][+pprefix][+uunit]
[/cc]
[cci_bash]+L[/cci_bash]はy軸のlabelを水平にします.[cci_bash]+p[/cci_bash]はラベルの前にprefix文字列を付け,[cci_bash]+u[/cci_bash]はラベルの後にunit文字列を付けます.ラベル数値の前に付けるか後に付けるかの違いです.
intervalsは以下のようになります.
[cc lang="bash"]
[a|f|g]stride[+-phase][u]
[/cc]
ただし,strideは[cci_bash]a[/cci_bash],[cci_bash]f[/cci_bash],[cci_bash]g[/cci_bash]の後に付ける数値で目盛り間隔です.[cci_bash]u[/cci_bash]は目盛り間隔の単位(unit)で時系列では重要です.例えば[cci_bash]Y[/cci_bash]は4桁の年,[cci_bash]y[/cci_bash]は2桁の年,[cci_bash]O[/cci_bash]は[cci_bash]FORMAT_DATE_MAP[/cci_bash]で指定した形式の「月」,[cci_bash]o[/cci_bash]は2桁の月,[cci_bash]U[/cci_bash]は[cci_bash]FORMAT_DATE_MAP[/cci_bash]で指定した週,[cci_bash]u[/cci_bash]は2桁の週,[cci_bash]D[/cci_bash]は[cci_bash]FORMAT_DATE_MAP[/cci_bash]で指定した日,[cci_bash]d[/cci_bash]は[cci_bash]FORMAT_DATE_MAP[/cci_bash]で指定した0-31の月の日付か1-366の年の日付,[cci_bash]R[/cci_bash]は[cci_bash]d[/cci_bash]と同じですが,[cci_bash]TIME_WEEK_START[/cci_bash]に位置づけたもの,[cci_bash]H[/cci_bash]は[cci_bash]FORMAT_CLOCK_MAP[/cci_bash]で指定した時,[cci_bash]h[/cci_bash]は2桁の時,[cci_bash]M[/cci_bash]は[cci_bash]FORMAT_CLOCK_MAP[/cci_bash]で指定した分,[cci_bash]m[/cci_bash]は2桁の分,[cci_bash]S[/cci_bash]は[cci_bash]FORMAT_CLOCK_MAP[/cci_bash]で指定した秒,[cci_bash]s[/cci_bash]は2桁の秒を表します.複雑ですが,典型的なものを作っておき,コピペで対応すればよいでしょう.
では,いよいよ例を見ていきます.本ポストの最初のbashスクリプトに示した[cci_bash]##### END
ここまでは共通で,以降の例では省略する[/cci_bash]の通り,それ以降のみ示します.

年月日軸

年月日軸の例を示します.まず,1年間の日付軸を主軸で3ヶ月毎,5日毎,副軸で1年毎として,できるだけ簡単に描いてみます.
[cc lang="bash"]
Bf=S
Bpx=pxa3Of5d
Bsx=sxa1Y
$gmt psbasemap -R2015-1-1T/2016-1-1T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -B"${Bsx}" -P > $ps
[/cc]


かなり見苦しいものになってしまいました.デフォルトでいくなら,副軸を付けずに,以下のようにした方がましでしょうか.

[cc lang="bash"]
Bf=S
Bpx=pxa3Of5d
$gmt psbasemap -R2015-1-1T/2016-1-1T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -P > $ps
[/cc]


意図したものにするには,[cci_bash]FORMAT_DATE_MAP[/cci_bash]と[cci_bash]FORMAT_TIME_PRIMARY_MAP[/cci_bash]を適切に設定する必要があります.以下の例を見てみましょう.

[cc lang="bash"]
$gmt gmtset FORMAT_DATE_MAP=o
$gmt gmtset FORMAT_TIME_PRIMARY_MAP=Abbreviated ### Abbreviatedは3文字,Characterは1文字
Bf=S
Bpx=pxa2Of10d ### 2ヶ月毎,10日毎
Bsx=sxa1Y ### 1年毎
$gmt psbasemap -R2015-1-1T/2016-1-1T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -B"${Bsx}" -P > $ps
[/cc]


月は2ヶ月毎のAbbreviated表示,日付は10日毎とし,年を副目盛りに表示しました.毎月表示するなら月のイニシャルのみとして,以下のようにするとよいでしょう.

[cc lang="bash"]
$gmt gmtset FORMAT_DATE_MAP=o
$gmt gmtset FORMAT_TIME_PRIMARY_MAP=Character ### Abbreviatedは3文字,Characterは1文字
Bf=S
Bpx=pxa1Of10d ### 1ヶ月毎,10日毎
Bsx=sxa1Y ### 1年毎
$gmt psbasemap -R2015-1-1T/2016-1-1T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -B"${Bsx}" -P > $ps
[/cc]


年と年初からの日数で表示するには以下のようにします.

[cc lang="bash"]
$gmt gmtset FORMAT_DATE_MAP=-jjj ### -を付けると先頭の0を削除する.=の前後にスペースを入れない
Bf=S
Bpx=pxa30Df5d ### 30日毎のラベル,5日毎の目盛り
Bsx=sxa1Y ### 1年毎の副目盛り
$gmt psbasemap -R2015-1-1T/2016-1-1T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -B"${Bsx}" -P > $ps
[/cc]


ここで,[cci_bash]FORMAT_DATE_MAP=-jjj[/cci_bash]の[cci_bash]=[/cci_bash]の前後にスペースを入れるとエラーとなりました.他ではエラーとはなっていなかったのですが,スペースを一切入れないようにする必要があります.

月日の軸

2017年11月1日から2018年1月15日までの軸で,[cci_bash]-Bpxa7Rf1d[/cci_bash]の[cci_bash]R[/cci_bash]で週の始まりで区切るようにし,[cci_bash]FORMAT_DATE_MAP=-o[/cci_bash]とハイフンを付けることで,一桁の日付に先頭の0を付けないようにしています.[cci_bash]=o[/cci_bash]とすると03のようになるものが[cci_bash]=-o[/cci_bash]とすると3になります.ここで注意ですが,週の始まりの定義が国(あるいは環境)によって異なるようで,私の環境では月曜日始まりになっており,GMTのマニュアルでは日曜日始まりになっているようで,結果が異なります.
[cc lang="bash"]
$gmt gmtset FORMAT_DATE_MAP=-o ### =の前後にスペースを入れない
Bf=S ### Frame parameters
Bpx=pxa7Rf1d ### 主x軸のAxes parameters Rは週始まりで区切り
Bsx=sxa1O ### 副x軸のAxes parameters 月
$gmt psbasemap -R2017-11-1T/2018-1-15T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -B"${Bsx}" -P > $ps
[/cc]


月に年号を付け,月を短く表示します.副軸で月と年を表示するので,[cci_bash]FORMAT_TIME_SECONDARY_MAP=Abbreviated[/cci_bash]とする必要があります.
[cc lang="bash"]
$gmt gmtset FORMAT_TIME_SECONDARY_MAP=Abbreviated ### Characterならイニシャル
$gmt gmtset FORMAT_DATE_MAP="-o yyyy"
Bf=S ### Frame parameters
Bpx=pxa7Rf1d ### 主x軸のAxes parameters
Bsx=sxa1O ### 副x軸のAxes parameters 月
$gmt psbasemap -R2017-11-1T/2018-1-15T/0/1 -JX10c/1c -B"${Bf}" -B"${Bpx}" -B"${Bsx}" -P > $ps
[/cc]

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください