【GMT】psxyコマンドを使ってグラフを描いてみた

## 概要
**GMT**（GMT6を想定）の**psxy**コマンドを用いてグラフを作成。
元々GMTは地図向けのツールだが、グラフ作成も可能。
グラフ作成ならPythonのmatplotlibなどもあるが、GMTなら記述量が少なく綺麗なグラフが描ける。
シェルベースなので、ターミナル直書きでも使えるのも良いところ。

## psxyのオプション

こんな感じのオプションを付ける必要があります。
オプションの詳細はQiitaでは割愛します。

**R**, **B**, **J**オプションは必須。
GMTの仕様上、追記する場合は**K**, **O**オプションも必要。
**W**オプションと**G**オプションの共存は難しい。

```bash:bash
gmt psxy ${データ} -R${描画範囲} -B${軸関連の設定} -J${図法・描画サイズ} -W${線の太さ・色} -S${挿入図形の種類・大きさ} -G${図形の塗りつぶし色} -K -O >> ${保存する画像のパス}
```



## グラフの例

こんなグラフたちができます。
徐々に難易度が上がり、変数は上から引き継いでいます。

これから使うデータパスはこれらを指しています。

```bash:psxy.sh
txtData=./data/data.txt
csvData=./data/data.csv
```

### 簡単なグラフ

基本的なグラフです。
実質１行。

```bash:psxy.sh                                                      
img=./img/test1.ps
range=1/5/0/10
base=a1f1g1/a2f3g4
gmt psxy $txtData -R$range -B$base -Jx3/2 -P > $img
```

![image](https://user-images.githubusercontent.com/93382642/140633762-d0cf91e4-4dbf-46e5-8f69-d9fcf16b81b5.png)



### タイトル・軸ラベル追加

**B**オプションに軸ラベルを示す「**: :**」やタイトルを示す「**:. :**」を追加しました。他は一緒。

```bash:psxy.sh
img=./img/test2.ps
base=a1f1g1:"x"::."title":/a2f3g4:"y":
gmt psxy $txtData -R$range -B$base -Jx -P > $img
```

![image](https://user-images.githubusercontent.com/93382642/140633764-1ded2e9f-29cd-4ece-9434-f13e8b793b28.png)

### 軸ラベルを一部のみ

**B**オプションに東西南北を示す「**SWne**」を追記。
小文字にすれば詳しいところは描かれなくなる。

```bash:psxy.sh
img=./img/test3.ps
base=a1f1g1:"x"::."title":/a2f3g4:"y":SWne
gmt psxy $txtData -R$range -B$base -Jx -P > $img
```

![image](https://user-images.githubusercontent.com/93382642/140633766-eff88f07-1d89-456e-a303-cc7292648135.png)

### 線に色を追加
**W**オプション登場。太さと色を指定可能。
色は**RGB**でも**16進数**でも可能。

```bash:psxy.sh                                                                      
img=./img/test4.ps
lineColor=0/128/0
gmt psxy $txtData -R$range -B$base -Jx -W1,$lineColor -P > $img
```

![image](https://user-images.githubusercontent.com/93382642/140633767-dfc78c2a-e352-42ae-a6ed-1ca5d903b4a7.png)

### 座標に図形を追加

線と図形を同時に描けないので２行に。
Scは**Circle**のCで数値は図形サイズ。形はSt(Triangle)など何種類かある。
追記なので、**K**, **O**オプションと出力を示す**>**と**>>**を考慮する形に。

```bash:psxy.sh
img=./img/test5.ps
circleColor=green
gmt psxy $txtData -R$range -B$base -Jx -W1,$lineColor -P -K > $img
gmt psxy $txtData -R -B -J -Sc0.2 -G$circleColor -O >> $img
```

![image](https://user-images.githubusercontent.com/93382642/140633768-f1a3671a-4886-42d2-980d-f03986ca8f01.png)

### 軸を複数に

**B**オプションを上手く使って２軸描画も可能。
**J**オプションを使って描画スケールは良い形にしてあげてください。

```bash:psxy.sh
img=./img/test6.ps
data2Color=red
data2Range=1/5/0/100
data2Base=a1g1/a20f10:"y2":E
gmt psxy $txtData -R$range -B$base -Jx -W1,$lineColor -P -K > $img
gmt psxy $txtData -R -B -J -Sc0.2 -G$circleColor -K -O >> $img
gmt psxy $csvData -R$data2Range -B$data2Base -Jx3/0.2 -W1,$data2Color -P -K -O >> $img
gmt psxy $csvData -R -B -J -St0.2 -G$data2Color -O >> $img
```

![image](https://user-images.githubusercontent.com/93382642/140633769-6fda6779-d6ec-4dde-8487-3419c85b3dc0.png)


### 凡例追加

凡例は全く説明してませんが、**pslegend**でできます。
いつかちゃんと説明します。

```bash:psxy.sh
img=./img/test7.ps
frameColor=0/0/255
backColor=#FFFFFF
legRange=1/18.5/1/1.2
gmt psxy $txtData -R$range -B$base -Jx3/2 -W1,$lineColor -P -K > $img
gmt psxy $txtData -R -B -J -Sc0.2 -G$circleColor -K -O >> $img
gmt psxy $csvData -R$data2Range -B$data2Base -Jx3/0.2 -W1,$data2Color -P -K -O >> $img
gmt psxy $csvData -R -B -J -St0.2 -G$data2Color -K -O >> $img
gmt pslegend -R -J -Dx$legRange -F+p1,blue+gwhite -O <<EOF >> $img                  
S 0 c 0.2 green black 0.2 y                                                         
S 0 t 0.2 red black 0.2 y2                                                          
EOF       
```

![image](https://user-images.githubusercontent.com/93382642/140633770-7fc8477a-237b-41f3-b4d3-c71d0cedc63e.png)

## まとめ

GMTは地図だけじゃないぞ！と言いたかっただけです。
２軸グラフまで理解できれば、グラフ作成には困らないのではないでしょうか。
これだけの記述量で実現できるのは嬉しいです。

## その他

GitHubに今回の内容に対応するソースコードを置いています。
実験したい方は使ってみてください。

https://github.com/khfkd/gmt_psxy_basics