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

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

-BオプションはFrame parametersとAxes parametersから構成され,

-BFrame_parameters -BAxes_parameters

のように,それぞれ分けて記述することができます.Frame_parametersとAxes_parametersの内部ではスペースを入れてはいけません.まず,Frame parametersから見ていきます.

Frame parameters

Frame parametersではどの軸を描くか設定します.矩形図の西,東,南,北に相当する,WESNを用い,大文字(WESN)なら軸目盛りとラベルを描き,小文字(wesn)なら軸目盛りだけを描きます.また,いずれも付けなければ,軸そのものを描きません.3次元でz軸がある場合は,同様にZまたはzを付けることができます.さらに,+gを追記して塗りつぶしを指定でき,+tを追記してタイトルを書けます.以下に例を示します.

-BWeSn  ### 左と下にラベル付きの軸目盛りを描き,左と上は軸目盛りだけ描きます
-BWS  ### 左と下のみラベル付きの軸目盛りを描きます
-BWS+glightred+t"Title"  ### +gで色を塗り,+tでタイトルを書きます
-BWeSnZ  ### 3次元の場合で,鉛直軸にもラベル付き軸目盛りを描きます

Axes parameters

それぞれの軸の目盛り間隔等を設定します.x,y,zの各軸別に

-Bx軸の設定 -By軸の設定 -Bz軸の設定

のように分けて設定するのがわかりやすいと思います.よく使うフラグはafgでそれぞれ(a)nnotation主目盛りの間隔(ラベル付き),(f)rame副目盛りの間隔(ラベルなし),(g)rid格子の間隔で,以下のように設定します.

-Bxa10f2g1  ### x軸を対象に主目盛り間隔を10,副目盛り間隔を2,格子間隔を1
-Byafg  ### y軸を対象にお任せで各目盛りを振る

さらに,追記で,デカルト座標系の場合には(地図では使えません)+lで軸名,+uで単位を付けることができます.文字列にスペースを含まない場合は" "を省略できます.

-Bxafg+l"x title"+u" unit"  ### "x title"を軸名," unit"を単位として描く

このように,基本は簡単ですが,日付軸や地理座標等の様々な軸を描くのは結構複雑なので,以下に示すようなGMTの公式ドキュメント公式チュートリアルに紹介されている具体例を参考にするのがよいでしょう.

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

ボックスを作り,色を塗り,お任せで座標軸目盛りを設定し,タイトルを付けます.ここで,はまりやすい点の注意です.以下のように変数を定義して用いる場合は

Bx=afg+l"x title"
-Bx"${Bx}"

のようにダブルクオーテーションで”変数”を囲んでおく必要があります.実際は+lでスペースを含む文字列を扱う場合にのみエラーとなるようですが,常に付けておきましょう.また,以下の例ではps=${0%.sh}.psという部分がありますが,これを理解するにはこちらが参考になります.

#!/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

対数軸のボックス

log-logの図を描きます.-JXの最後にlを付けるとlogになります.-Bya1ppはべき乗(power)表示を意味します.pの前は常に1でよいでしょう.-Byafの後の数値の効果はわかりにくいので適当に試してみましょう.例えば,fの後の数値は,1は副目盛りなし,2は2つ副目盛りが入る,3は細かく副目盛りが入り,4以上は3と同じ,といったように決まっているようです.

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

同様ですが,-Bxa2a1にすると以下のようになります.

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

地図を描く

次にpscoastを使って地図を描きましょう.地図の場合は-Bx-lによる軸タイトルの描画ができません.-lはデカルト座標系のみで使えます.gmtsetはデフォルト値を上書きし,フォントの大きさや枠のタイプ等,様々な設定が可能です.また,デフォルト値の変更は

$ gmt defaults -D >gmt.conf

でカレントディレクトリにgmt.confをコピーし,これを編集することでも可能です.さらに,

$ gmt defaults -D >~/gmt.conf

でホームディレクトリにコピーするか,~/.gmt/gmt.confにコピーし,編集すれば,デフォルト値そのものを変更できます.
-Sは水域の塗りつぶしで,-Wは線の太さをpointで指定します.-Gは陸域の塗りつぶしです.-Dは解像度で,(f)ull, (h)igh, (i)ntermediate, (l)ow, (c)rude,または(a)utomaticが選択できます.(a)では最適なものが選ばれます.pscoastにはたくさんのオプションがあり,河川や国境も描けます.

$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

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

時系列デカルト座標系

次に時系列について見ていきます.-Bオプションでこれまで使っていなかった,Axes parametersの(p)rimary軸と(s)econdary軸を組み合わせることと,gmtsetFORMAT_DATE_MAPを適切に設定するのがポイントになります.ここであらためて-Bオプションの全体像を見ておきます.
既述のように,-BオプションはFrame parametersとAxes parametersから構成されます.Frame parametersの全体像は以下のようになります.

-B[WwSsEeNn][+b][+gfill][+n][+olon/lat][+ttitle]

+gはキャンバスの塗りつぶしを行い,+nを付けるとフレームを一切描きません.+Oは格子線に係わるものですが普通は使わないでしょう.
一方,Axes parametersの全体像はx軸について見ると以下のようになり,(p)rimary軸と(s)econdary軸に分けて設定できます.

-B[p][x]intervals[+l|Llabel][+pprefix][+uunit]
-B[s][x]intervals[+l|Llabel][+pprefix][+uunit]

+Lはy軸のlabelを水平にします.+pはラベルの前にprefix文字列を付け,+uはラベルの後にunit文字列を付けます.ラベル数値の前に付けるか後に付けるかの違いです.
intervalsは以下のようになります.

[a|f|g]stride[+-phase][u]

ただし,strideはafgの後に付ける数値で目盛り間隔です.uは目盛り間隔の単位(unit)で時系列では重要です.例えばYは4桁の年,yは2桁の年,OFORMAT_DATE_MAPで指定した形式の「月」,oは2桁の月,UFORMAT_DATE_MAPで指定した週,uは2桁の週,DFORMAT_DATE_MAPで指定した日,dFORMAT_DATE_MAPで指定した0-31の月の日付か1-366の年の日付,Rdと同じですが,TIME_WEEK_STARTに位置づけたもの,HFORMAT_CLOCK_MAPで指定した時,hは2桁の時,MFORMAT_CLOCK_MAPで指定した分,mは2桁の分,SFORMAT_CLOCK_MAPで指定した秒,sは2桁の秒を表します.複雑ですが,典型的なものを作っておき,コピペで対応すればよいでしょう.
では,いよいよ例を見ていきます.本ポストの最初のbashスクリプトに示した##### END
ここまでは共通で,以降の例では省略する
の通り,それ以降のみ示します.

年月日軸

年月日軸の例を示します.まず,1年間の日付軸を主軸で3ヶ月毎,5日毎,副軸で1年毎として,できるだけ簡単に描いてみます.

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



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

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



意図したものにするには,FORMAT_DATE_MAPFORMAT_TIME_PRIMARY_MAPを適切に設定する必要があります.以下の例を見てみましょう.

$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



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

$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



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

$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



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

月日の軸

2017年11月1日から2018年1月15日までの軸で,-Bpxa7Rf1dRで週の始まりで区切るようにし,FORMAT_DATE_MAP=-oとハイフンを付けることで,一桁の日付に先頭の0を付けないようにしています.=oとすると03のようになるものが=-oとすると3になります.ここで注意ですが,週の始まりの定義が国(あるいは環境)によって異なるようで,私の環境では月曜日始まりになっており,GMTのマニュアルでは日曜日始まりになっているようで,結果が異なります.

$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



月に年号を付け,月を短く表示します.副軸で月と年を表示するので,FORMAT_TIME_SECONDARY_MAP=Abbreviatedとする必要があります.

$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