gnuplot tips

困ったら`awk`を呼び出していた自分へのメモ

# ヘッダーを飛ばす
### 例：　先頭10行(列名など)を飛ばす

```
gnuplot> plot "hoge.txt" every ::10
```
`every`で指定。
1行目のみヘッダーの場合は、

# 区切り文字
### 例: csvファイル
```
gnuplot> set datafile separator ","
```

# 条件に合う範囲のみをプロット
### 例：　二列目が2以上ならそのままプロット、2以下はゼロに

```
gnuplot> plot "hoge.txt" using 1:($2>2 ? $2 : 0)
```

三項演算子`?`をつかっている。


# データ加工
### 例：　1列目をx,3列目をyに描画する時、3列目を100倍

```
gnuplot> plot "hoge.txt" using 1:($3*100)
```
`using`で指定。加工する軸では`( )`と`$`を忘れずに！!

# 複数データの表示
### `replot`はやめて`,`を使う
```
gnuplot> plot "hoge.txt", "fuga.txt"
gnuplot> plot "hoge.txt" using 1:2, "hoge.txt" using 1:3
```
`plot`内でデータを`,`でつなぐ
`replot`を多用すると.epsや.pdf出力で嵌る(グラフがたくさん出てくるよ)ので、オススメしない。
（`replot`は、あくまでも再描画の意味で、`replot "data"`では、再描画時にデータを上書きするという意味になる。）

### `plot for`で賢く
```
gnuplot> plot "hoge.txt" using 1:2, "hoge.txt" using 1:3, "hoge.txt" using 1:4 
gnuplot> plot for [i=2:4] "hoge.txt" using1:i 
gnuplot> plot for [i=2:*] "hoge.txt" using1:i 
```
hoge.txtに4列のデータがあり、1列目をxに、2~4列目をyにする場合、上記3行は同じ意味となる
`plot for`を使うと、`,`で書き下さなくてもよくなる
`plot for [i=2:*]`とすると、 最終列まで描画してくれる
ただし、`plot for`は`gnuplot ver 4.4`以降でないといけない(らしい)

### `title`をつけると、なおよし
```
gnuplot> plot for [i=2:*] "hoge.txt" using 1:i title sprintf("%d",i)
```
`title`でプロットデータの凡例
`sprintf()`の`" "`は、`%d`が書式(整数)で、他に任意の文字を入れれる
つまり、`sprintf("number: %d",i)`とかすると、凡例が`number : 1`などとなる

### 1列目にタイトルが並んでいるならば`columnheader（i）`
```
gnuplot> plot for [i=2:*] "hoge.txt" using 1:i title columnheader（i）
```
`columheader(i)`はgnuplotのデフォルト関数で、1行目のi列目の文字列を返してくれる
例えば下記のように、化学組成が分析毎に並んでいる場合、

```data.txt
measure C O Fe-L Mg Al Si S Cl Ca Cr Fe-K Co Ni Cu 
1 369162 136654 16894 24230 6015 43864 29975 13965 6146 181 37332 6567 2621 13747 
2 370436 133514 17154 24277 6102 43712 29662 13737 6178 159 37230 6544 2704 13704 
3 369622 130737 17036 24093 6094 43985 29920 13796 6156 157 38031 6563 2663 13513 
4 371086 126829 16972 24287 5991 43373 29739 13910 6089 152 37345 6331 2719 13373 
5 368830 125949 17080 24233 6106 43506 30016 13826 5994 165 37613 6404 2706 13212 
...
```
`plot for`と`columnheader()`を使い、

```
gnuplot> plot for [i=2:*] "data.txt" using 1:i title columnheader（i） with linepoint
```
とすると、下記のようなグラフが1行で描ける
<img width=300 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221968/02b0c81d-3fb9-644d-9544-961a64710611.png>
`l`を押して、対数表示にしてもいいかも。
ちなみに`with linepoint`で、点+線描画です。
(Oの減少が他よりも速いですねぇ。。。)

なお、

```
gnuplot> set key autotitle columnheader
gnuplot> plot for [i=2:*] "out.txt" using 1:i w lp
```
も同じ出力結果を得るが、`set autokey columnheader`で`title columnheader(i)`を自動設定したという解釈。他のデータフォーマットと合わせて`plot`すると混乱の元。混ぜな危険。


このくらいできると表計算ソフトに入れて表示するより`gnuplot`を使う方が便利と実感できるはず。
逆に、何か計算結果・分析結果をテキストファイルにまとめる時は、1行目にタイトルをつけることを習慣づけると吉。

### おまけ: ワンライナーの虜さんへ
これで幸せを感じられるかも？

```
gnuplot> p for [i=2:*] "out.txt" u 1:i w lp t columnheader
```
`p`は`plot`、`u`は`using`、`w lp`は`with lineplot`、`t`は`title`です。
また、`columnheader(i)`は`columnheader`です。
暗号だね。

# データ補間
大量の描画点に対して傾向を見たい時に。

```
gnuplot> plot "hoge.txt" smooth sbezier
```
`smooth option`で指定。
`with lineplot`などは省くこと。
`option`には補間方法が入る。
統計ノイズの場合は、`sbezier`(ベジエ曲線)や`acsplines`(スプライン曲線)とかでしょうか。
詳しくはマニュアルへですが、重みの設定もできるようです。

# 頻度分布（ヒストグラム)
gnuplot 5.3のマニュアルを読むと、下記のようにすればいいらしい。
[gnuplot](http://gnuplot.info/demo_5.3/bins.html)

>EXPERIMENTAL (implementation details may change in a later version) Syntax:
plot ’DATA’ using <XCOL> {:<YCOL>} bins{=<NBINS>}
{binrange [<LOW>:<HIGH>]} {binwidth=<width>}

floor関数やint関数で頻度を調べてからplotするやり方もあるらしい(古い方法？）

### 例: 7列目にあるデータを、bin数 10で頻度分布を描画

```
plot "data.txt" using 7 bins=10 with boxes
```

### 例: 6列目にあるデータを、bin数 自動、bin幅=0.5で頻度分布を描画

```
plot "data.txt" using 6 bins binwidth=0.5 with boxes
```

### 例: 5列目にあるデータを、bin数 自動、bin幅=0.5で、20~80の間で頻度分布を描画

```
plot "data.txt" using 5 bins binrange [20:80] binwidth=10 with boxes
```

### boxの装飾

```
set style fill solid border lc rgb "black"
plot "data.txt" u 5 with boxes lw 1 lc rgb "light-cyan"
```

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221968/ac7ff66c-8dd6-4cb5-f616-829d9251715b.png">

`set style`で、box内を塗りつぶし、box枠は黒色と設定
`plot`内の`lw`と`lc`で、外枠太さと塗りつぶしの色を設定


### 例: 7~10列目にあるデータを、bin幅0.05で頻度分布を描画、1列目をタイトルに。
先の例のように、`plot for`と`t columnhead`を用いることができる。

```
plot for [i=7:10] "data.txt" using i bins=0.05 with boxes t columnhead
```

# 下付き文字"_"の無効

```
set title "hoge_hoge" noenhanced
```

`noenhanced`をつける


# 外部コマンドの呼び出し
### 例: `awk`の使用
1列目をx,3列目をyに描画する時、3列目を100倍する時

```
plot "< cat hoge.txt | awk '{print $1,$3*100}'" 
```
`plot`内で`<`を使用

# 参考
[gnuplot のページ (Takeno Lab)] (http://takeno.iee.niit.ac.jp/~foo/gp-jman/)