可視化ツール

波形やスペクトルを「見える化」するためのグラフ化ツールが必要で、 私自身は出力データをパイプでグラフ化ツールに繋げば 適当なグラフを描いてくれるようなコマンドを自作して使ってきましたが、 ここでは、gnuplot を使って、 自作のグラフ化ツールと同じような操作で使える簡単なスクリプト pを 用意して、 それを使うことにします。

次のような仕様です。

  コマンド	p - 折れ線グラフ作成
  構文		p [オプション]
  オプション	-L	両対数プロット
  		-Lx	x 軸片対数プロット
  		-Ly	y 軸片対数プロット
  		-x	x 軸データなし
  		-Tpng	PNG イメージ出力
例             p < file             # file のデータを折れ線グラフで表示
指定されたファイルから下記形式のデータを読んで、折れ線グラフを作成します。
[..] の表示は、.. の部分が省略可能であることをあらわします。

[v x1 y1 x2 y2]     # ビューポートの左下を (x1, y1) 右上を (x2, y2) に設定
[wx u1 u2 [u3 u4]]  # X 軸ウインドウを u1<=x<=u2 大目盛間隔 u3 小目盛間隔 u4
[wy v1 v2 [v3 v4]]  # Y 軸ウインドウを u1<=x<=u2 大目盛間隔 u3 小目盛間隔 u4
[x x軸ラベル]       # X 軸ラベルの文字列を指定
[y y軸ラベル]       # Y 軸ラベルの文字列を指定
[s 表題]            # 表題文字列を指定
[l 1 つ目のラインラベル]  # 一つ目のグラフにラベル文字列を指定
[l 2 つ目のラインラベル]  # 二つ目のグラフにラベル文字列を指定
[l 3 つ目のラインラベル]  # 三つ目のグラフにラベル文字列を指定
[l 4 つ目のラインラベル]  # 四つ目のグラフにラベル文字列を指定
x1 y11 [y21 [y31 [y41]]]  # y1=f(x1,y11), y2=f2(x1,y21), .. のデータを記述
x2 y12 [y22 [y32 [y42]]]  # y1=f(x1,y12), y2=f2(x1,y22), .. のデータを記述
..
xi y1i [y2i [y3i [y4i]]]  # y1=f(x1,y1i), y2=f2(x1,y2i), .. のデータを記述
..

ビューポート(viewport)は画面のどの区画に描画するかを決定します。 初期値は「v 0.0 0.0 1.0 1.0」で、 これが全画面になります。

ウィンドウ(window)はビューポートに設定する X-Y 座標系ですが、 均等目盛(linear scale)の場合は

  wx u1 u2 [u3 u4]
  wy v1 v2 [v3 v4]
  ここに、
	u1 = X 軸左端座標      v1 = Y 軸下端座標
	u2 = X 軸右端座標      v2 = Y 軸上端座標
	u3 = X 軸大目盛間隔    v3 = Y 軸大目盛間隔
	u4 = X 軸小目盛間隔    v4 = Y 軸小目盛間隔
対数目盛の場合は
  wx u1 u2
  wy v1 v2
  ここに、
	u1 = log10(X 軸左端座標)    v1 = log10(Y 軸下端座標)
	u2 = log10(X 軸右端座標)    v2 = log10(Y 軸上端座標)
で指定します。「wx 0 3」なら X 軸左端が 1、X 軸右端が 1000 になります。

ウィンドウ wx, wy を指定しない場合は、 自動的(auto scale)に設定されます。

折れ線グラフのデータは左端の列が X 軸の値、 2 列目以降は Y 軸の値で、 同じ画面に 4 本までのグラフを重ねて表示することができます。

例えば、y = x と y = 2*x で近似できる二つのデータなら、 下記のようなデータを標準入力から与えます。

--
1 1 2
2 2 4
3 3 6
--

複数のデータを空白行で区切って、 それぞれの表示位置をビューポートで指定すると、 一画面に複数のグラフを描画することができます。

--
v 0.0 0.5 0.0 0.5
s データ (1)
y f(x)
x x
l f1(x)
l f2(x)
1 1 2
2 2 3
3 3 4

v 0.5 1.0 0.5 1.0
1 1
2 1.414
3 1.732
4 2

v 0.0 0.5 0.5 1.0
wx 0 3
wy 0 3
1 1
10 10
100 100
1000 1000

v 0.5 1.0 0.0 0.5
wx 0 3 1 0.5
wy 0 3
0 1
1 10
2 100
3 1000
--

このスクリプトのようなawkの使いかたはUnixの典型的手法で、 troffの作図用 preprocessor idealの作者による下記の 論文もあります。

Christopher J. Van Wyk,- AWK as glue for programs
  Software: Practice and Experience
  Volume 16, Issue 4, pages 369-388, April 1986

平林浩一, 2016-06