0

出力ファイルが次のようになるように、複数の粒子の反復位置を計算します。

x1(t=0) y1(t=0)
x2(t=0) y2(t=0)
...
xn(t=0) yn(t=0)

x1(t=1) y1(t=1)
...
xn(t=1) yn(t=1)

(a lot of blocks)

x1(t=p) y1(t=p)
...
xn(t=p) yn(t=p)

たとえば、パーティクル 1 はブロックの各最初の行などにあります。

各粒子の軌跡を 1 つのプロットにプロットする必要があり、点と線がリンクされています。私が遭遇した問題は、正しい粒子に対応するポイントを適切にリンクすることです。データの再フォーマットを推奨するアドバイスを見つけましたが、それを処理する方法がわかりません。プロット コマンドを使用して軌跡を直接プロットすることも可能かもしれませんが、ここでも解決策が不足しています。

4

2 に答える 2

0

残念ながら、現在のデータファイル設定でこれを行う方法はありません。every( e) キーワードを使用して、ポイントを接続しないプロットを作成できます。

plot for [i=0:NPOINTS-1] 'test.dat' e ::i::i w p

しかし、データセットを接続したい場合、それはあまり役に立ちません。データを「反転」する必要があります。pythonそれは非常に簡単なので、私は使用します:

#pythonscript.py
import sys  #allow us to get commandline arguments

#store data as
#[[x1(t=0) y1(t=0),x2(t=0) y2(t=0),x3(t=0) y3(t=0),...],
# [x1(t=1) y1(t=2),x2(t=2) y2(t=2),x3(t=2) y3(t=2),...],
#  ... 
# [x1(t=N) y1(t=N),x2(t=N) y2(t=N),x3(t=N) y3(t=N),...],
#]

with open(sys.argv[1]) as fin:
    data = []
    current = []
    data.append(current)
    for line in fin:
        line = line.rstrip()
        if line:
           current.append(line)
        else:
           current = [] 
           data.append(current)


#now transpose the data an write it out.  `zip(*data)` will give you:
#[(x1(t=0) y1(t=0),x1(t=1) y1(t=1),x1(t=2) y3(t=2),...),
# (x2(t=0) y2(t=0),x2(t=1) y2(t=1),x2(t=2) y2(t=2),...),
# ...
# (xN(t=0) yN(t=0),xN(t=1) yN(t=1),xN(t=2) yN(t=2),...),
#]
for lst in zip(*data):
    for dpoint in lst:
        print dpoint
    print

私にとって、入力ファイル(test.dat)が与えられた場合:

x1(t=0) y1(t=0)
x2(t=0) y2(t=0)
xn(t=0) yn(t=0)

x1(t=1) y1(t=1)
x2(t=1) y2(t=1)
xn(t=1) yn(t=1)

x1(t=p) y1(t=p)
x2(t=p) y2(t=p)
xn(t=p) yn(t=p)

実行すると次のpython pythonscript.test.datようになります。

x1(t=0) y1(t=0)
x1(t=1) y1(t=1)
x1(t=p) y1(t=p)

x2(t=0) y2(t=0)
x2(t=1) y2(t=1)
x2(t=p) y2(t=p)

xn(t=0) yn(t=0)
xn(t=1) yn(t=1)
xn(t=p) yn(t=p)

これで、andyras によるソリューションを使用してプロットできます。

plot for [i=0:NP] '< python pythonscript.py data.dat' index i w lp
于 2013-04-12T14:51:17.717 に答える