gnuplot のテキスト端末出力と、Emacs 連携
ソフトウェアの性能や安定性の懸賞のために、なんらかのテストを行い、結果をグラフ化することがあります。昔からソフトウェア屋に限らず幅広く利用されている gnuplot というグラフの出力ツールがあります。グラフ書く以外にも色々と機能があるみたいなのですが、先日ふと知ったテキスト端末出力が便利だったので、メモがわりのエントリを。
グラフをテキスト端末にアスキーアートで出力すると、チャットやチケットにコピペでき、テスト結果の共有が簡単にできました。最終的には綺麗なグラフを書く必要がある場合も多いでしょうが、速報や要約の目的でケースバイケースで使いわけると便利です。
参考
- gnuplot のホームページ gnuplot homepage
- 日本語マニュアルもある http://www.gnuplot.info/documentation.html
- Emacs gnuplot-mode http://xafs.org/BruceRavel/GnuplotMode
- Emacs gnuplot-mode の日本語での簡易説明 http://homepage1.nifty.com/fin/soft/emacs/gnuplot-mode.html
gnuplot のインストール
私は MacPorts を使っているので port コマンドでインストールしました。
たいていのプラットフォームではパッケージがあることでしょう。
$ sudo port isntall gnuplot
MacPorts では依存で AquaTerm (http://sourceforge.net/projects/aquaterm/) もインストールされます。
後に説明する端末設定で MacOSX では AquaTerm も利用可能です。
gnuplot の実行と、テキスト端末出力
インストールはすぐ終わりましたが、このエントリの主目的であるテキスト端末出力も3行で終わります。
コマンドラインで gnuplot を実行して、2つの gnuplot コマンドを実行しましょう。
$ gnuplot
gnuplot> set terminal dumb gnuplot> plot sin(x)
はい、終わり。これでお使いの端末にこんなかんじのグラフが出力されたはずです。
1 ++---------------***---------------+---**-----------+--------**-----++ + * * + * ** + sin(x) ****** + 0.8 ++ * * * * * * ++ | * * * * * * | 0.6 *+ * * * * * * ++ |* * * * * * * | 0.4 +* * * * * * * ++ |* * * * * * * | 0.2 +* * * * * * *++ 0 ++* * * * * * *++ | * * * * * * *| -0.2 ++ * * * * * * *+ | * * * * * * *| -0.4 ++ * * * * * * *+ | * * * * * * * -0.6 ++ * * * * * * +* | * * * * * * | -0.8 ++ * * * * * * ++ + * * + ** * + * * + -1 ++-----**--------+-----------**----+--------------***---------------++ -10 -5 0 5 10
見事なサインカーブ!
説明するまでもないですが、 set terminal コマンドを使って、出力先を dumb に設定しています。この出力先はアスキーアートで出力を表示します。詳しくは日本語の PDF マニュアルを見ると良いでしょう。
最初からテキスト端末を出力先に指定するには、~/.gnuplot を作って、コマンドを実行させます。
set terminal dumb
大きさの設定
set terminal コマンドのオプションで、出力する大きさの設定ができます。
例えば、次のようなコマンドで、チャットに貼りやすそうな、ちょっと小さめに出ます。
set xrange [0:2*pi] set yrange [-1.4:1.4] set terminal dumb 50 20 # small plot sin(x)
表示の際は、軸の刻み(tick)がグラフと重なると見にくいので、ちょっと range を広めに取るのが良さそうです。
結果は次の通り。
+-----+------+-----+-----+------+-----+-+ + + + + +sin(x)+****** | 1 ++ ***** ++ | ** *** | | ** ** | 0.5 ++ ** * ++ |** ** | 0 ** ** +* | ** ** | ** **| -0.5 ++ * ** ++ | ** ** | | *** ** | -1 ++ ***** ++ + + + + + + + | +-----+------+-----+-----+------+-----+-+ 0 1 2 3 4 5 6
Emacs gnuplot-mode.html
メモついでに Emacs の gnuplot インターフェースを。
Emacs のメジャーモードとして gnuplot-mode があり、とても便利です。MacPorts で入れた場合、 /opt/local/share/emacs/site-lisp/gnuplot.el[c] に入ってました。CarbonEmacs の場合は、最初から入ってます。
簡単には、gnuplot のコマンドをファイルに書いておいて、行や範囲指定で実行する、というだけです。それだけでも、 gnuplot はパラメータをちょこちょこ変えながら実行するので、地味に効きます。
ファイルの拡張子は、 *.gp にすると初期設定で有効になるようです。
コマンドは予め定義されている2つと、自分定義の1つ(しか使ってない)。
- C-c C-l
- ポイントのある行のコマンドを実行する
- C-c C-r
- 選択された範囲のコマンドを実行する
- C-c C-p
- 再描画 (replot)
個人的には同じプロットコマンドで再描画をよく使うので、次のように定義しています。
(defun gnuplot-send-replot-to-gnuplot () "Sends replot to gnuplot" (interactive) (gnuplot-send-string-to-gnuplot "replot\n" 'line) ) (define-key gnuplot-mode-map "\C-c\C-p" 'gnuplot-send-replot-to-gnuplot)
これで、Emacs の中で gnuplot のコマンドを編集して、実行でき、さらにテキスト端末出力の場合は、gnuplot 出力のバッファへグラフも出力されるため、Emacs の中で結果確認までできます。