gnuplot のテキスト端末出力と、Emacs 連携

ソフトウェアの性能や安定性の懸賞のために、なんらかのテストを行い、結果をグラフ化することがあります。昔からソフトウェア屋に限らず幅広く利用されている gnuplot というグラフの出力ツールがあります。グラフ書く以外にも色々と機能があるみたいなのですが、先日ふと知ったテキスト端末出力が便利だったので、メモがわりのエントリを。

グラフをテキスト端末にアスキーアートで出力すると、チャットやチケットにコピペでき、テスト結果の共有が簡単にできました。最終的には綺麗なグラフを書く必要がある場合も多いでしょうが、速報や要約の目的でケースバイケースで使いわけると便利です。

参考

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

メモついでに Emacsgnuplot インターフェースを。

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 の中で結果確認までできます。

おまけ AquaTerm (Mac OS X のみ)

アスキーアートではなく、ちゃんとしたグラフ印刷するときには、Mac OS X では AquaTerm が便利なようです。set terminal aqua すると使えます。

以上、gnuplot の小ネタでした。