Gnuplot:在单独的块中绘制多个对象的轨迹

时间:2013-04-12 10:24:56

标签: gnuplot

我计算多个粒子的迭代位置,以便我的输出文件看起来像:

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位于块的每个第一行等

我需要在单个图中绘制每个粒子的轨迹,并用线连接点。我偶然发现的问题是正确链接对应于正确粒子的点。我找到了一些建议重新格式化数据的建议,但我不知道如何处理它。也许可以用绘图命令直接绘制轨迹,但我再次对解决方案不感兴趣。

2 个答案:

答案 0 :(得分:0)

您应该可以使用循环(在gnuplot> = 4.6中)和plot命令的index选项来执行此操作:

p = (number of particles)
plot for [i=0:p] 'data.dat' index i with linespoints

with linespoints选项听起来也像你想要的那样,它将数据点与行链接起来。

答案 1 :(得分:0)

不幸的是,目前的数据文件设置无法做到这一点。您可以使用everye)关键字制作不连接点的绘图:

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)

现在您可以使用the solution by andyras

绘制该图
plot for [i=0:NP] '< python pythonscript.py data.dat' index i w lp