DOSEIの日記

技術メモ+日常ログ

自動インデックスをラベル化するには (Gnuplot 4.2)

Gnuplot の 2 次元プロットを考える. (3 次元でもほぼ同様)
通常データのプロットでは、 y 座標だけのデータか、 x, y 座標のデータを与える.
それぞれ、 using に使われる列番号は以下のように対応する。

データ $0 $1 $2
y 座標のみ 自動インデックス y なし
x, y 座標 自動インデックス x y

したがって、 y 座標のみの場合、using 1 が省略されたとみなされるが、これは using 0:1 と指定されたのと同じことになる。つまり、 x 座標としては自動的に 0 からの整数値が振られる。

さて、 with labels スタイルをつけた場合、第3番目のデータがラベルとなる。この場合、省略すると 1:2:3 とみなされる。当然、 1 または 2 カラムしかないデータの場合、何も表示されない(この場合はエラーもでない)。

で、ラベルとして、自動インデックスを使いたい。つまり、 using 1:2:0 をやりたいのだが、実際にはうまくいかない*1using 1:2:2 は意図したとおり、第2カラムが表示される。using 1:2:($0) もできない。using 1:2:(stringcolumn(0)) はなぜかエラー。

で、 gprintf 関数を噛ませればいけるらしい。

plot 'hoge' using 1:2:(gprintf("%.0f", $0)) with labels

gprintf の書式指定には整数が無いので、実数 (f) の小数点以下の桁数を 0 にするのがポイント。

最近のバージョン (4.6 で確認) では、単に 0 を指定するだけで実現できるようになっている。

自動インデックスの種類

カラム番号には、 0 の他、 -1, -2 もある。

データブロックとデータセット

Gnuplot の入力に使われるデータファイルにおいて、1行の空行と、2行の空行は特別な意味を持つ。どちらも with lines または with linespoints などでは折れ線が分離される。1行の空行によって分けられたデーはデータブロック (block/datablock) とよばれ、 every によって制御できる。2行の空行で分割されたデータ(ブロックの集合) は、データセット (data set) とよばれ、 index によって制御できる。

自動インデックスの性質

0 から始まり、以下の条件で、増加、リセットされる。

カラム番号 増加 リセット
0 データ (行) データセット
-1 データブロック データセット
-2 データセット なし

負のカラム番号を参照するには?

using では、カラム番号を直接指定するか、() で囲まれた式によるデータ値を書くの。後者の場合は指定したカラムの値は $n で指定する。しかし、 $-1, $(-1), ${-1} などと書くことはできない。
このような場合、 column(-1) を使えばよい。たとえば、上でやったようなプロットは gprintf("%.0f", column(-1)) とすればよい。

点とラベルを同時に付ける

と、いうことは、標準の機能ではできないので、以下のように2つのプロットを重ねる。

plot \
"hogehoge" using 1:2:(gprintf("%.0f", $0)) w labels offset 1,1, \
"" w lp

同じファイルのプロットは、空文字列を指定すればよい。それから、 offset が指定できることはドキュメントのどこにも載ってない気がする。

*1:バグなのかもしれない。報告してみる価値はある