11

プロットするファイルが500あり、これを自動的に実行したいと思います。ハードコードされたファイル名でプロットを行うgnuplotスクリプトがあります。異なるファイル名で反復ごとにgnuplotを呼び出すループが欲しいのですが、gnuplotがコマンドライン引数をサポートしていないようです。

簡単な方法はありますか?また、Pythonスクリプトで実行できる場合に備えてgnuplot-pythonパッケージもインストールしましたが、APIが見つからなかったため、理解するのが少し難しいです。

ありがとうございました!

4

8 に答える 8

22

行を先頭に追加することで、gnuplot スクリプトをシェル スクリプトに変換できます。

#!/bin/sh
gnuplot << EOF

行を追加する

EOF

$そして、すべてをに置き換えます\$。次に、ファイル名のすべての出現箇所を で置き換え$1、ファイル名をパラメータとしてシェル スクリプトを呼び出すことができます。

于 2010-12-07T18:25:28.360 に答える
6

Sven Marnach のソリューションの $ について (EOF 間の行は、シェル用語で「ヒア スクリプト」と呼ばれます): 私の経験では、通常どおりシェル変数を使用しますが、gnuplot 自体を意味する $ はエスケープする必要があります。

次に例を示します。

for distrib in "uniform" "correlated" "clustered"
do
    gnuplot << EOF
    # gnuplot preamble omitted for brevity

    set output "../plots/$distrib-$eps-$points.pdf"
    set title "$distrib distribution, eps = $eps, #points = $points"

    plot "../plots/dat/$distrib-$eps-$points.dat" using 1:(\$2/$points) title "exact NN"
EOF

done

gnuplot が認識できるように、ドルをエスケープするバックスラッシュに注意してください。

于 2011-06-14T20:43:23.390 に答える
1

私があなたの質問を誤解しない限り、もっと簡単な方法があります。

gnuplotスクリプトで、出現するすべてのファイル名を。に置き換えます$0。次に、bashで、プロットファイル($ plotsDirの.txtファイルであるとしましょう)をループして、gnuplotを呼び出します。

for f in "$plotsDir/*.txt"; do
    echo "call '$f'" | gnuplot
done
于 2013-02-01T21:37:09.950 に答える
1

私はこれを何度かやったことがあります。ただし、EOF は使用しないでください。bash では << EOF および EOF タグ内に書き込むことはできません。ファイルの名前に応じて、さまざまな方法で実行できます。

a) ファイル名がループ可能な場合 (1.dat 2.dat 3.dat など)

#!/bin/bash    
for((i=0;i<1;i++)) do
  echo "plot '-' u 1:2"
  for((j=1;j<=3;j++)) do
     cat $i.dat
     echo "e"
  done
done | gnuplot -persist

最初のループは、すべてを gnuplot に送るための一種のバッファです。

b) ファイル名がループ可能でない場合 (ñlasjkd.dat ajñljd.mov añlsjkd.gif など)、最初にそれらを新しいフォルダーに移動する必要があります。それからする

#!/bin/bash    

ffiles=$(ls | xargs)       # a list of the folder's files
# Use the list to pipe all the data to gnuplot using cat
for((i=0;i<1;i++)) do
  echo "plot '-' u 1:2 w lp"; 
  cat $ffiles; 
  echo "e"; 
done | gnuplot -persist

c) さらに必要な場合、つまり、分割されたファイルの情報を 1 つのファイルだけに保持する場合...ただし、データシートを維持するには、gnuplot の「インデックス」を使用します (gnuplot が 2 つの黒い線を読み取った場合、それは別のデータシートであると推測します)。

#!/bin/bash

ffiles=$(ls|xargs)
ls $ffiles > ffiles.list # A file with the folder's files
while read line 
do
    cat $line; 
    echo -e; echo -e;
done < ffiles.list > alldata.dat 
# ^-feeding ffiles.list to the while loop 
# and writing the file alldata.dat

これで、gnuplot に移動して 1 つのデータシートにアクセスできます

plot 'alldata.dat' index 1 u 1:2

リスト「ffiles.list」に最初のファイルが表示されます。複数見たい場合は4と言ってください

plot 'alldata.dat' index 1:4 u 1:2

トリッキーだけど簡単。

于 2012-04-18T00:51:06.113 に答える
1

簡単な方法は、次のように 500 個の gnuplot スクリプトを生成することです。

for filename in list_of_files:
    outfile = open(filename + '-script', 'w')
    outfile.write(script_text % (filename,))

ここscript_textで、gnuplot スクリプトのテキストは、ファイル名が%s.

于 2010-12-07T17:05:47.593 に答える
0

これを行う 1 つの方法を次に示します。あなたのgnuplot入力ファイル、例えばplot.gp、行が含まれています

plot "data"

またはそのようなもの。この行の前の行を に保存し、このplot1.gp行の後の行をに保存しますplot2.gp。gnuplot を次のように呼び出します。

gnuplot plot1.gp -e `plot "data"` plot2.gp

dataこれにより、コマンド ラインでの名前の受け渡しが容易になります。

于 2010-12-07T17:05:00.777 に答える
0

test.txt含むという名前のファイルを作成しますplot [0:20] x;

実行するgnuplot test.txtと、gnuplot が実際にファイルの内容を読み取ったので、実行時に引数をサポートしていることがわかります。

于 2010-12-07T17:08:23.823 に答える
0

この問題を解決するさまざまな方法は、コマンドライン引数を gnuplot に渡すには? にも記載されています。:

  • 使用する-e
  • -corcallと同様の変数を使用ARG0(gnuplot >= 5)
  • 同様の変数を使用callする$0(gnuplot <= 4.6.6)
  • 環境変数の使用とsystem()
  • プログラムを gnuplot にパイプする
于 2016-07-14T05:53:35.067 に答える