8

私はこのフォーマットのファイルを持っています:

x y1 y2 y3 ei1 ei2 ei3 es1 es2 es3
1 4 5 4 7 7 2 4 7 7
2 7 3 3 3 8 3 3 3 8
3 2 1 4 4 9 6 4 4 9

次のコマンドが与えるものと同様のプロットを作成したい

plot "filename" using 1:2:5:8  with yerrorbars

ただし、columns headers(、、、xおよび)を使用してそれらを呼び出します。これはどのように行うことができますか?y1ei1es1

gnuplotマニュアル(usingコマンドを文書化)の84ページには次のように書かれています。

Height Weight Age
val1   val1   val1
...    ...    ...

次のプロットコマンドはすべて同等です

plot ’datafile’ using 3:1, ’’ using 3:2

plot ’datafile’ using (column("Age")):(column(1)), \
’’ using (column("Age")):(column(2))

plot ’datafile’ using "Age":"Height", ’’ using "Age":"Weight"

しかし、私がそれらを試したとき、私は行インデックスとそれ自体しか得られませんでした。

4

1 に答える 1

5

gnuplot4.4とgnuplot4.6(現在の安定版リリース)のドキュメントをざっと見てみると、使用しようとしている機能はおそらくgnuplot 4.5で導入されたようです(奇数は開発ブランチです-安定していると見なされた場合、それらは偶数にインクリメントされます)。これを達成するために考えることができる唯一の方法は、列番号を(stdoutに)返す他の言語で簡単なスクリプトを書くことです。これはPythonを使用した簡単な例ですがawk、すべてPOSIX環境にとどまりたい場合は、これを実行できると確信しています。

#python indexing is 0 based, gnuplot datafile indexing 1 based
COL_AGE=`python -c 'print(open("datafile").readline().split().index("AGE")+1)'`
COL_HEIGHT=`python -c 'print(open("datafile").readline().split().index("HEIGHT")+1)'`
plot "datafile" u COL_AGE:COL_HEIGHT

この小さなスクリプトは特別なことは何もしませんが(たとえば、列ヘッダーが最初の行にあることを前提としています)、Pythonの機能を使用すると、スクリプトをさらに拡張するのは非常に簡単です。

#!/usr/bin/env python
import sys
with open(sys.argv[1]) as f
   for line in f:
       if (line.strip()):
           print (line.split().index(sys.argv[2])+1)
           sys.exit(0)

これで、このスクリプトを次のように呼び出すことができます python script.py datafile AGE。「AGE」がどの列にあるかを確認します。「AGE」がどの列にもない場合はエラーになります。

于 2012-07-16T12:22:57.757 に答える