web-dev-qa-db-ja.com

gnuplotスクリプトへのプロットデータのパイプ

3つのプロットを含むgnuplotを作成します。データはインラインにする必要があります

次のようになります。

https://s22.postimg.cc/qcc94e1i9/test.png

現在、次のgnuplotスクリプトを使用してプロットを作成しています。

set terminal png
set output "test.png"
plot for[col=2:4] "data.txt" using 1:col title columnheader(col) with lines

ファイル data.txtは:

Generation Best Worst Average
0 2 1 0
1 3 1 2
2 4 3 3
3 4 3 3
4 6 3 4
5 7 4 5
6 9 6 7
7 10 6 9
8 10 5 6
9 11 6 8
10 12 7 9

Data.txtをgnuplotにパイプし、スクリプト内で参照されているデータファイルに依存しないようにします。何かのようなもの cat data.txt | gnuplot plot.gnu。その理由は、いくつかのdata.txtファイルを作成し、plot.gnuこれらのそれぞれのファイル。

特別な'-' file このstackoverflowスレッド内 と私は 1つのファイル内の複数のプロット について読みました。ただし、これにはgnuplotコードにデータを含める必要があり、クリーンではありません。

25
user524824

Unixシステム(Windows以外)を使用している場合は、'<cat' の代わりに '-' stdinから読み取る:

plot '<cat' using ...

その後、cat data.txt | gnuplot script.gp。ただし、質問で言及している特定のケースでは、forループ内のプロットで、入力を3回読み取ります。そのため、stdinを介してデータを送信することは適切ではありません。データは最初に読み取られた後に失われるためです。

25
Dan Stahlke

直接的な答えではありませんが、これは私がデータをすばやく見るために使用するものです。 cutコマンドで特に役立ちます

cat data.txt | cut -f2 -d' ' | gnuplot -p -e "plot '<cat'"
20
kirill_igum

シェルからgnuplotの-eオプションを使用することの何が問題になっていますか?以下を使用して、シェルから変数、たとえばdata.txtを入力として提供できます。

gnuplot -e "filename='data.txt';ofilename='test.png'" plot.gnu

Forループを使用して、シェルから「ファイル名」の異なる値で上記のコマンドを複数回呼び出すことができるはずです。

そして、スクリプトplot.gnuを次のように変更します。

set terminal png
set output ofilename
plot for[col=2:4] filename using 1:col title columnheader(col) with lines
13
SidR

パイプからのデータを複数回プロットする場合は、何らかの方法でメモリに保存する必要があります。私の好ましい方法は、ほとんどのLinuxシステムに存在し、RAMにマップされる/dev/shmの一時ファイルを使用することです。物事をきれいに保つために、終了時に一時ファイルを削除するトラップを設定します。

例(data.txtを使用):

cat data.txt | (cat > /dev/shm/mytempfile && trap 'rm /dev/shm/mytempfile' EXIT && gnuplot -e "set terminal dumb; plot for[col=2:4] '/dev/shm/mytempfile' using 1:col title columnheader(col) with lines")

結果:

12 ++------------+-------------+-------------+-------------+------------**
   +             +             +             +             + Best ****** +
   |                                                        Worst***#### |
10 ++                                              *******Average $$$$$$++
   |                                           ****                      |
   |                                        ***    $$$$               $$$$
 8 ++                                     **     $$    $$        $$$$$  ++
   |                                    **     $$        $$    $$        |
   |                               *****    $$$              $$       ####
 6 ++                          ****       $$ ############# $$    #####  ++
   |                         **         $$ ##             #  ####        |
   |                       **        $$$ ##                ##            |
   |                     **      $$$$  ##                                |
 4 ++         ***********   $$$$$  ####                                 ++
   |     *****  ###################                                      |
   | ****   $$##                                                         |
 2 **    $$$##                                                          ++
   #########                                                             |
   + $$          +             +             +             +             +
 0 $$------------+-------------+-------------+-------------+------------++
   0             2             4             6             8             10
12

System()コマンドの使用方法

set terminal png
set output "test.png"

# read Shell input
# the echo prints the variable, which is then piped to gnuplot
fname = system("read filename; echo $filename")

plot for[col=2:4] fname using 1:col title columnheader(col) with lines 

あなたは今それを呼び出すことができます

echo "data.txt" | gnuplot script.gp
2
smoebius