余白の書きなぐり

aueweのブログ

シェルスクリプトに Gnuplot のコマンドを埋め込む方法

シェルスクリプトから数値計算プログラムを走らせて、 結果を Gnuplot するような場合に、 わざわざ表示用の Gnuplot スクリプトを別ファイルに準備するのが面倒くさい。 すべての処理を単一のシェルスクリプトファイルで済ませてしまいたい。そんな時のためのメモ。

一番簡単なパターン

以下の内容を hoge.sh で保存して $ bash hoge.sh すれば sin 関数が描画される。 普通の Gnuplot スクリプトと違って、コマンド文の行末にセミコロン ; を付ける必要がある。 改行のエスケープはあってもなくてもよい。 pause -1 しないと画像が一瞬で消える。

# hoge.sh
# y = sin(x) を描画

gnuplot -e "
  plot sin(x) ;
  pause -1 
  "

要するに Gnuplot のスクリプト部分にセミコロンを付けて gnuplot -e"" でサンドイッチすればよい。

シェル変数を Gnuplot に読み込ませる場合
# hoge.sh
# y = sin(x) + 3 をタイトル付きで描画

TITLE="SIN WAVE"
a="3"

gnuplot -e "
  set title '$TITLE' ;
  plot sin(x) + $a ;
  pause -1 
  "
標準入力から数値データを読んでプロットする場合

数値計算プログラムを走らせて、得られたデータをプロットする場合は以下のような感じ。 plot '-'を使えばよい。 echo の部分を数値計算プログラムの出力だと思ってほしい。

# hoge.sh
# (1,5) (2,10) (3,15) をプロット

echo '1 5
      2 10
      3 15 '|\
gnuplot -e "
  plot '-' ;
  pause -1 
  "

もちろんシェルスクリプトの中に Gnuplot のコマンドを書くと、 VimGnuplot 用シンタックスハイライトが効かずバグが発生しやすい。 横着はよくない。でも面倒くさい。


2013/7/27 追記

こういうやり方もある。行末にセミコロンがいらない。 うちの環境では、グラフをファイルに保存する場合はうまくいくけれど、 GUIでインタラクティブに表示させるとエラーが出た。

# hoge.sh
# y = sin(x) をsin.pngに保存

gnuplot << EOF
  set terminal png
  set output 'sin.png'
  plot sin(x)
EOF