2010-12-07 14 views
11

私は500のファイルを作図しており、これを自動的に行いたいと思います。私はgnuplotスクリプト を持っていて、ファイル名をプロットしてハードコードしています。別のファイル名でgnuplotを繰り返し実行するループを作りたいのですが、gnuplotがコマンドライン引数をサポートしていないようです。Gnuplotは実行時に異なる引数を取ることができますか?多分Pythonで?

簡単な方法はありますか?私はpythonスクリプトを介してそれを行うことができる場合に備えてgnuplot-pythonパッケージもインストールしました。しかし、私はapiを見つけることができなかったので、理解するのは少し難しいです。

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

答えて

22

あなたはライン

#!/bin/sh 
gnuplot << EOF 

EOF 

行を追加し、\$によってすべての$を代入を付加することで、シェルスクリプトにあなたのgnuplotスクリプトを変換することができます。次に、ファイル名のすべての箇所を$1に置き換えて、ファイル名をパラメータとしてシェルスクリプトを呼び出します。

+0

魅力的な作品...ありがとう! 毎回違うファイルでこのgnuplotをループして呼び出すスクリプトを追加しました。 – user431336

0

ここでこれを行う方法の1つです。あなたのgnuplotの入力ファイル、plot.gpを言って、ライン

plot "data" 

またはそのような何かが含まれています。この行の前の行をplot1.gpに、この行の後の行をplot2.gpに保存します。今、コマンドラインでdataの名前を渡し容易

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

としてgnuplotを呼び出します。 script_text%sに置き換えたファイル名であなたのgnuplotスクリプトのテキストです

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

+0

おかげでプログラムをパイピング変数(gnuplotの< = 4.6.6)

  • 環境変数を使用してsystem()
  • ようは、それはしかし、1つのマイナーな問題を動作します。私はgnuplotのスクリプト行に以下のようなファイル名を使用しています:set output 'data.png'。私はそれをコマンドライン引数で置き換える必要もあります。 – user431336

  • +0

    もちろん、スクリプトをさらに多くのファイルに分割できますが、おそらく私の他の答えを見ることができます。 –

    1

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

    +1

    あなたの解決策は自動的に500個のスクリプトを生成し、gnuplotを500回呼び出すスクリプトを書くことです。最も洗練されたソリューションではありませんが、これは機能します。ありがとう! – user431336

    +0

    ええ、エレガンスは彼らが何をしているのか知っている人のためのものです。私はhttp://www.nmichaels.org/graph/graphinator.py – nmichaels

    0

    私はplot [0:20] x;

    を含むtest.txtという名前のファイルを作成し、私はgnuplot test.txtを実行し、私はgnuplotは確かに私のファイルの内容を読み取るていることがわかり、それは実行時にサポート引数を行います。

    +0

    を書いたにもかかわらず、gnuplotについてはほとんど知りません。それは本当です。 gnuplotスクリプトを実行して実行します。しかし、私の質問は、gnuplotスクリプトで使用される引数を取ることです。私はそれをとてもうまく説明しなかったかもしれない。ありがとう。 – user431336

    6

    Sven Marnachの解決策(EOFの間の行は、シェルの言葉では "here script"と呼ばれます)について:私の経験上、シェル変数は通常どおり使用しますが、$ sは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はそれを見ているように、バックスラッシュはドルを脱出します。

    1

    私はこれをいくつかやりました。しかし、あなたは< < EOFとEOFタグの中にbashで書くことはできないので、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.datajñljd.movañ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の操作を行います。ただ一つのファイルに分離したファイルの情報を保持するために...しかし、gnuplotは読み込む場合のgnuplotのデータシート生き使用「インデックス」(maintaning別のデータシートである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に登場する最初のファイルが表示されますすることができます。リスト"。複数を見たいと思ったら、4

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

    トリッキーですが簡単です。

    1

    あなたの質問を誤解していない限り、より簡単な方法があります。

    gnuplotスクリプトで、ファイル名のすべての箇所を$0に置き換えます。この問題を解決するための

    for f in "$plotsDir/*.txt"; do 
        echo "call '$f'" | gnuplot 
    done 
    
    0

    異なる方法もHow to pass command line argument to gnuplot?でカバーされています:

      その後はbashで、ループあなたのプロットファイルのgnuplotと呼び出し(のは、彼らが$ plotsDirで.txtファイルをしているとしましょう)以上 変数のよう ARG0-c又は callを使用 -e
    • を使用
    • (gnuplotの> = 5)
    • 012とcallを使用gnuplotのに
    関連する問題