gnuplotの目新しい機能

gnuplotの古くからの機能を使ってる人(私を含む)のためのメモ。

💡 gnuplot 5.4を対象に、最近のバージョンアップで追加された機能、今のバージョンで使える便利そうな機能などを以下に示す
古くからある機能でも便利そうなものについては言及している

# プログラミング関連
## 変数
- `array name[size]`で配列(Array)が使用可(例： `Array A = [1,2,3]`)
    - 文字列、整数、実数、複素数を要素とできる
    - 要素の混在も可
    - `|A|` : 配列`A`のサイズ
- 現在の内部状態を直前の描画を反映した読み出し専用の定義済み変数
    - それらの変数は名前が`GPVAL_`で始まる
    - `show variables all` : それらの変数を含めた変数の一覧の表示

## 制御構造

- ループブロックにおいて、`break`, `continue`が使用可
- `for [stringvar in "A B C D"]` の形で文字列変数による繰り返しを`plot`コマンドなどに用いることが出来る
- ループとして、以下の形式でwhileも使用可
    
    ```
    while (<expr>) {
    	<commands>
    }
    ```
    

## マクロ置換

- 下記例の様に、`@VARNAME`の形で文字列変数に定義した文字列によりコマンド文字列を置換できる
    
    ```
    style1 = "lines lt 4 lw 2"
    style2 = "points lt 3 pt 5 ps 2"
    range1 = "using 1:3"
    range2 = "using 1:5"
    plot "foo" @range1 with @style1, "bar" @range2 with @style2
    ```
    

## evalコマンド

- `eval <string expression>`により動的に生成されるコマンド文字列を実行できる
- 下記例の様に、パラメータを変えて同じコマンドを複数回実行する場合に便利
    
    ```
    set_label(x, y, text) \
    = sprintf("set label '%s' at %f, %f point pt 5", text, x, y)
    eval set_label(1., 1., 'one/one')
    eval set_label(2., 1., 'two/one')
    eval set_label(1., 2., 'one/two')
    ```
    

# グラフ形式

- `splot with plygons`  : 多面体の面データを読み込んで描画
- `set spiderplot` : 　クモの巣グラフ
    - `set style siderplot`
- `set table` : テーブルモードが有効な場合に、`plot`, `splot`で表形式の描画
- `set mapping {cartesian | spherical | cylindrical}`で座標系を指定することで、`splot`で球面座標や円柱座標でデータを与えることができる

# グラフ化対象データ関係

- `set datafile fortran`を実行することで、**fortran**の数値書式で書かれたファイルを読み取れる
- `set datafile missing` により、データファイル中で欠損データを表す文字列を指定することが出来る(gnuplotでは**欠損データ**と**無効な値**は区別されている)

## plotコマンドの引数関係

### 範囲(range)

- plotコマンドの1番最初の項目として、軸の範囲の指定が可能
    
    ```
    plot [<xrange>][<yrange>][<x2range>][<y2range>]
    ```
    
- 各範囲の指定は、以下の形式
    
    `[{<dummy-var>=}{{<min>}:{<max>}}]`
    `[{{<min>}:{<max>}}]`
    
- **min**または**max**として、`*`を指定すると最小値や最大値を自動的に使用される
    - 自動的に決められる値に対して、下限・上限を`{ <lb> < } * { < <ub> }` の形で指定出来る
        - 例: `[0 < :*]`は、最小値を0以上で自動決定した範囲
- 各グラフ化対象(特に関数)に対しても範囲指定が可能
    
    ```
    plot [-1:1] [0.5:1] sin(x)
    ```
    
    - 全体に対する範囲であるかあいまいになる場合にはキーワード`sample`を用いる
        
        ```
        plot sample [0.5:1] sin(x)
        ```
        

### `using`

- 文字列定数を指定すると、その文字列は**scanf**関数の書式指定文字列として解釈され、それを用いてファイルから読み取られる
- `using 1:($2+$3)`の形式で列のデータにより計算した値を指定することが可能
- `$2`は`column(2`)の略記
- `column($#)` : 最終列　(`$#`は列数を表す)
- `column(**NAME**)` :  ヘッダーで列名が**NAME**となっている列(`set key autotitle columnhead`を実行のこと)
- `using`のパラメータに列番号ではなく、ヘッダーで決まった列名を指定することも可
- `column(0)` : データ集合内での各点の順番。順番は0 から始まり、空行やコメント行でない行で増え、2 行の連続する空行でリセットされる(略記$0 も使用可)
- `column(-1)` : この番号は0 から始まり、1 行の空行で増え、2 行の連続する空行でリセットされる。これは、行列、または格子状データ内のデータ行に対応。また、データ集合
内の別々の線分や多角形を区別するのにも使える。
- `column(-2)` :  0 から始まり、2 行の連続する空行で増えます。これは、複数のデータ集合を持つファイル内の、現在のデータ集合のindex 番号
- `column($#)` : 特別な記号$# は、存在する全列数と評価されるゆえ、`column($#)` は、現在の入力行の最終列(最右列)を参照。同様に`column($# - 1)` は、最終列の一つ手前の列、などとなる。

### `title`

- `title columnheader`または`title columnheader(N)`を指定することで、列名を系列タイトルとして表示させることが可能
- オプション指定`at beginning`または`at end`を指定することで、系列タイトルを描画される曲線の最初または最後に書かせることが可能

# スタイル要素関連

- `title`はplot実行後に評価されるように変更された。plot時に計算される値を参照可
- pointsize, pointtype, colorの指定をキーワード`variable`とすることで、データの値を用いることが可能に
    - `using`指定が無い場合には、x,y,pointsize,pointtype,colorの順に解釈される
    - `using`指定もこの順
- `plot`コマンドの`axes`パラメータで`x1y2`などと指定することで、x軸またはy軸を2軸目とすることが出来る

# 外部出力、Terminal関連

- `set term windows`でグラフメニューより、EMFファイルやPNGファイル(ビットマップファイル)で出力可能

# `save`コマンド

- 以下のキーワードを指定することで、特定のものだけをファイルに保存できる
    - `save terminal`
    - `save variables`
    - `save terminal`
    - `save set`
    - `save fit`

# その他

- `stats 'filename'` : 簡単な統計情報の提供

- グラフに追加する近似曲線を得るために、`fit`コマンドにより、非線形最小二乗法当てはめのパラメータを計算することができる
    
    ```
    f(x) = a + b*x + c*x**2
    fit f(x) 'measured.dat' using 1:2 via a,b,c
    plot 'measured.dat' u 1:2, f(x)
    ```
    

- plotコマンドのsmoothパラメータを用いることで、スプライン近似などが使える
    
    指定可能な近似方法は以下
    
    - bezier : ベジュ曲線
    - csplines : Cスプライン
    - mcsplines : 元の点の単調性と凸性をキープした3次スプライン

- `history`コマンドで出力ファイルを指定することにより、コマンド履歴をファイルに保存すること可能
    - saveコマンドで出力する場合には、デフォルト設定も保存されるが、それがない分シンプルとなる
    - 個数を指定する(例：`history 10 “hoge.gpl”`)ことで直前の指定分だけ保存させることも可能
    - `history`コマンドの実行そのものは、履歴リストに加わらない(そのためカーソルキーによる履歴呼び出しでも出てこない)
- `test`コマンドを実行することで、使っている**terminal**に対して、凡例に用いれる色名や線種などを表示させることができる

- `set loadpath`コマンドにより、読み込まれるファイルの検索パスを追加定義する
    - 複数のパスを追加する際には、コロン`:`で区切る
    - 環境変数**GNUPLOT_LIB**も検索パスを定義する