例題演習GMT（１）：簡単な１次元グラフ

# 簡単な１次元グラフの作図
GMTは習うより慣れろ。例題と課題でGMTの使い方を理解しよう。
まずは、簡単な1次元グラフの作図から。

## 例題
次のようなデータ（東京の年平均気温データ）をGMT(5.4.3)で図化する。
なお、データは[気象庁HP](http://www.data.jma.go.jp/obd/stats/etrn/index.php)のデータを加工して作成した（実際の観測値を保証するものではありません）。

```temp.txt
year	temperature[C]
2000	16.9
2001	16.5
2002	16.7
2003	16.0
2004	17.3
2005	16.2
2006	16.4
2007	17.0
2008	16.4
2009	16.7
2010	16.9
2011	16.5
2012	16.3
2013	17.1
2014	16.6
2015	16.4
2016	16.4
2017	15.8
```

GMTのスクリプトは次のようになる。
スクリプトの実行は、Linux（Ubuntu等）を奨励します。実行する際には、改行コードをLFで保存してください。

```shell:plot_exam01.sh
#!/bin/bash
#--------------------------------------------------
# plot for GMT5
# 簡単な1次元グラフ
#--------------------------------------------------

#----- 前処理・設定 ------------------------------

# GMTパラメーター
gmt gmtset FONT_ANNOT_PRIMARY 10p,Helvetica # 主目盛りのフォント
gmt gmtset FONT_LABEL         10p,Helvetica # 軸タイトルのフォント

# input
in01=temp.txt                   # 入力ファイル
in01_h=1                        # ヘッダー行数

# output
ps=plot_exam01.ps               # 出力psファイル

# グラフの設定（-Jオプション）
mp=X                            # 地図の投影法(X:xy, M:メルカトル図法)
gx=10                           # グラフの幅[cm]
gy=5                            # グラフの高さ[cm]
jopt=$mp${gx}c/${gy}c           # -Jオプション

# グラフの範囲(range)（-Rオプション）
rw=2000                         # x軸の最小値(west)
re=2018                         # x軸の最大値(east)
rs=12                           # y軸の最小値(south)
rn=20                           # y軸の最大値(north)
ropt=$rw/$re/$rs/$rn            # -Rオプション

# 軸・目盛りの設定（-Bオプション）
ti_x="Year"                                  # x軸タイトル
ti_y="Annual Average Temperature[@~\260@~C]" # y軸タイトル
tics_x=a5f1                                  # x軸の目盛り(a=主,f=副)
grid_x=                                      # x軸のグリッド(g)
tics_y=a2f1                                  # y軸の目盛り(a=主,f=副)
grid_y=g2                                    # y軸のグリッド(g)
axis=WeSn                   # 軸表示（大文字：軸＋目盛り、小文字：軸）

# 線の設定
line01=0.8p,black               # 線：太さ,色,線種

# シンボルの設定
st01=c                          # シンボルの種類(c,s,d,t,+,x等)
ss01=0.15c                      # シンボルのサイズ
sc01=white                      # シンボルの色
sl01=$line01                    # シンボルの線(太さ,色,線種)

# 画像変換(psconvert)の設定
pc_fmt=g            # g=png, b=bmp, j=jpg, t=tiff, e=eps, f=PDF, s=SVG
pc_res=300          # 図の解像度(DPI)
pc_mgn=0.1c         # グラフ外側のマージン
pc_aa=2             # アンチエイリアシングの設定(1,2,4)

#----- plot ------------------------------

echo "plot $ps"

# basemap(グリッド線のみ)
gmt psbasemap -J$jopt -R$ropt -Bx$grid_x -By$grid_y -B+n -P -K > $ps

# psxy(line)
gmt psxy $in01 -h$in01_h -J -R -W$line01 -K -O >> $ps

# psxy(symbol)
gmt psxy $in01 -h$in01_h -J -R -S$st01$ss01 -G$sc01 -W$sl01 -K -O >> $ps

# basemap(枠線)
gmt psbasemap -J -R -Bx$tics_x+l"$ti_x" -By$tics_y+l"$ti_y" -B$axis -O >> $ps

#----- 後処理 ------------------------------

# png変換
gmt psconvert -A$pc_mgn -E$pc_res -T$pc_fmt -Qt$pc_aa -Qg$pc_aa $ps
```

作成されたグラフ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/195213/72b46230-06a3-e98a-e30a-98ed60ddafbc.png" width=500>


## 解説
### GMTスクリプトについて
GMTは「gmt コマンド オプション」という書き方をする（GMT5以降）。
上記の例では、GMTのコマンドとして、psbasemap（枠線などの作成）, psxy（線・シンボルの作成）, psconvert（psファイルの変換）が使われている。
コマンドを使用して、ポストスクリプト(ps)ファイルに線やシンボルを上書きしていくように作図する（そのため、順番が重要となる）。

### psbasemap
+ 枠線を作成するコマンド（[本家のマニュアル](http://gmt.soest.hawaii.edu/doc/5.4.3/psbasemap.html)）。
+ 実のところ、枠線の作成は、-J, -R, -Bオプションによってプロットされるので、他のコマンドでも代用は可能である。しかし、-J, -R, -Bオプションを他のコマンドで用いると、可読性が悪くなる。よって、例では枠線のオプション（-J, -R, -B）はpsbasemapだけで設定している。

-J, -R, -Bオプションの概要は以下の通り。

### -Jオプションの概要
+ -Jオプションはグラフの図法を指定する。
+ 必須オプションであり、すべてのコマンドで-Jオプションを記述する必要がある。-Jのみの場合は、前回の-Jオプションと同じ設定となる。通常は最初だけ-Jオプションの詳細を記述すれば良い。
+ 今回は1次元グラフ（XY-plot）なので、-JX、または-Jxとなる。
+ -JXはグラフ（枠線）のサイズを指定し、-Jxは比率（グラフの1単位あたりのサイズ）で指定する。
+ 例では、変数の値を代入すると、-JX10c/5c、となるので、10cm×5cmのグラフという意味になる（cはcmのこと）。
+ ちなみに、A4縦で図を配置する場合、１段組みでは-JXで10〜12c、２段組みでは-JXで4.5〜5.5cぐらいになる。大きさは、図を実際に貼り付けてみて調整する。

### -Rオプションの概要
+ -Rオプションはグラフの範囲を指定する（必須オプション）。
+ -Rのみの場合は、前回の-Rオプションと同じ設定となる。
+ -R左端/右端/下端/上端、で指定する。

### -Bオプションの概要
+ -Bオプションは枠線を指定する。
+ 枠線の設定（目盛り線(tics)、目盛り数値(annotation)、軸タイトルなどの設定）と、枠線を付ける場所の設定の２種類がある。
+ 枠線の設定は、「-Bx」でx軸の指定、「-By」でy軸の指定をする。x,y軸の同時指定をする場合は、「-Bxy」となる。
+ 枠線を付ける場所の設定は、「-B」とする（-Bのあとにx,yを付けない）。例では、-BWeSn。WeSnの部分は枠線と目盛り数値(annotation)をプロットする場所を意味する（wesnの方位に対応）。大文字の場所は目盛り数値付きとなる。
+ 例の場合は、WとSが大文字なので、西側（x軸下側）と南側（y軸左側）に目盛り数値が入る。東側(e)と北側（n）は枠線と目盛り線(tics)のみ。
+ 枠線をどこにも付けない場合は、「-B+n」とする。ただし、グリッド線のみのプロットは可能なので、例の最初のpsbasemapではグリッド線のみプロットするようにしている（グリッド線が折れ線やシンボルの後ろに描画されてほしいため）。


### psxy
+ 線やシンボルをプロットするコマンド（[本家のマニュアル](http://gmt.soest.hawaii.edu/doc/5.4.3/psxy.html)）。
+ 「psxy *INPUT_FILE* *OPT*」のように実行する。
+ -hは読み込むファイルのヘッダーの行数を指定する。
+ -Sはシンボルの形と大きさを指定する。よく使うシンボルの形には、c=circle（丸）、s=square（四角）、t=triangle（三角）、d=diamond（ひし形）、+=十字型、x=X字型などがある。
+ -Wは線種を指定するオプション。-Sがなければ折れ線の線種、-Sがあればシンボルの線種となる。
+ GMTでは、シンボルと折れ線を同時にプロットすることができない。したがって、シンボル付きの折れ線グラフを作成するには、psxyコマンドを２回実行する必要がある。

### psconvert
+ GMTはps（ポストスクリプト）形式でファイルが作成される。
+ 他の画像形式に変換するには、psconvertを使う。


## 課題
### 課題(1)
以下のようなグラフを作成せよ。
変更点：グリッドなし、シンボルなし、線色（blue）。
<img src="https://qiita-image-store.s3.amazonaws.com/0/195213/c9ada096-3d5b-26cf-8b0e-6ba9b0102a99.png" width=500>

### 課題(2)
以下のようなグラフを作成せよ。
変更点：グラフ範囲(x,y)、グリッド線(x,y)、目盛り(y)、線色（blue)、シンボルの形（diamond）と色（色なし）。
<img src="https://qiita-image-store.s3.amazonaws.com/0/195213/8a021039-169a-f67e-cb09-8416790fd3c3.png" width=500>



## 解答

### 課題(1)
+ gridはgrid_yをコメントアウトするか、変数に空白を代入すれば良い。
+ 線色はblueと色名を記述するか、line01=0.8p,0/0/255、でも良い（R/G/Bを0〜255で指定）。

```shell:plot_assign01-01.sh（変更点）
grid_y=                         # y軸のグリッド(g)
line01=0.8p,blue                # 線：太さ,色,線種

# psxy(symbol)
#gmt psxy $in01 -h$in01_h -J -R -S$st01$ss01 -G$sc01 -W$sl01 -K -O >> $ps
```

### 課題(2)
+ シンボルのひし形はd=diamond。
+ シンボルの色なしは、シンボルの色を「-」（ハイフン）に変更すれば良い。あるいは、psxyのコマンドから、-G$symC01、の部分を削除しても良い。

```shell:plot_assign01-02.sh（変更点）
re=2020                         # x軸の最大値(east)
rs=15                           # y軸の最小値(south)
rn=18                           # y軸の最大値(north)
grid_x=g5                       # x軸のグリッド(g)
tics_y=a1f0.2                   # y軸の目盛り(a=主,f=副)
grid_y=g1                       # y軸のグリッド(g)
line01=0.8p,blue                # 線：太さ,色,線種
st01=s                          # シンボルの種類(c,s,d,t,+,x等)
ss01=0.2c                       # シンボルのサイズ
sc01=-                          # シンボルの色
```