どせいたんさき。

ナスダヨー

gnuplot で標準入力から入力したデータでプロットを書く

目的

以下のようにして gnuplotスクリプト中で標準入力からデータを読み込みたい.

# hoge.dat というデータファイルを hoge.gp というスクリプトで処理した結果を表示する
cat hoge.dat | gnuplot -p hoge.gp
# データファイルを fuga.dat に変えても同じ処理ができる
cat fuga.dat | gnuplot -p hoge.gp

なお plot コマンドで読み込むファイルの名前を - にすればデータを直接入力できるようになる.しかしスクリプトファイルで同じことをしようとすると plot 命令の直後にデータを書かなければならない.プロットに使うためのスクリプトファイルを自動生成するような処理を書けば解決できるが,今回別の解決方法を見つけたのでまとめておく.

解決方法

やりたいことは読み込むべきファイルの名前を < cat - にするだけで実現できた.一般的にリダイレクト(<)を使用するとコマンドの実行結果を読み込むデータとして扱うことができる.以下に例を示す.

plot '< seq 1 10' u 1:(log($1)) w lp

ということで plot '< cat -' というかたちで plot コマンドを実行すると標準入力に入ってきたデータをそのままプロットできるようになる.

サンプル

以下のスクリプト(putcircle.gp)では赤外線観測におけるディザリングの振り幅について検討するために作成したものである.入力として期待されているのは 3 カラムのデータで,それぞれ視野中心からの距離・角度,天体の大きさ(半径)である.不透明度 0.5 で塗りつぶしているので天体が重なっている箇所が一目でわかるようになっている.

#!/usr/bin/gnuplot

## putcircle.gp
# Input: 3 column data
# 1st column: distance from the FOV center
# 2nd column: angle in degree
# 3rd column: size of circle in radius
set style line 1 lc rgb "coral"

FOV=51.1
set xr [-FOV/2.0:FOV/2.0]
set yr [-FOV/2.0:FOV/2.0]
set size ratio -1
set key samplen 1

posX(r,t) = r*cos(pi*t/180.0)
posY(r,t) = r*sin(pi*t/180.0)

plot '< cat -' u (posX($1,$2)):(posY($1,$2)):($3) \
     t "Objects" w circles ls 1 fs transparent solid 0.5
###

使い方と作成された図をいかに示す.

awk 'BEGIN{for (i=0; i< 8; ++i) {print 15, -45*i+22.5, 10} print 0,0,10}' | gnuplot -p putcircle.gp